|
|
|
|
|
для: Trianon
(07.04.2006 в 20:44)
| | Мне кажется эта задача не совсем удобна для регулярных выражений, так как число полей заранее не известно. Его наверное можно составить, но получится очень сложное...
PS Во Фридла лишний раз лазить не следует - черезвычайно занудное чтение :))) | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 15:40)
| | А вы посмотрите в скрите http://www.softtime.ru/info/csv.php, как там решается эта проблема. | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2006 в 20:39)
| | Cheops! Как насчет варианта того же самого на базе preg_match?
Только чур с Фридла не списывать :)) | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2006 в 20:39)
| | счас заценю =)) | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 16:52)
| | Вот. Найдете баги - пишите.
<?php
// --------------------------------------------------------------------------
// программа импорта CSV файла в массив PHP
// Автор: Томашпольский Д.Ф. (aka Trianon)
// e-mail: toddy at mail dot ru
// Версия: 1 (2006-04-07)
// --------------------------------------------------------------------------
$csv = '';
if(isset($_FILES['csv']) && $_FILES['csv']['name'] != '') // если задан файл
$csv = $_FILES['csv']['tmp_name'];
// пример применения
if($csv != '')
{
$list= array();
$f = fopen($csv, 'r'); // открываем загруженный файл,
while(!feof($f)) // читаем строки
if(($line = fgets($f)) != '') // обход пустой строки в конце файла
$list[] = csv_convert_line($line); // формируем двумерный массив полей
echo "<pre>";
print_r($list); // печатаем то, что получилось.
echo "</pre>";
}
//-----------------------------------------------------------------------------
// $array_of_fields = csv_convert_line($line);
//-----------------------------------------------------------------------------
// преобразует строку CSV-файла в массив полей
// по умолчанию считается, что поля разделены символами ';'
// и при необходимости заключены в ограничители '"',
// но их можно указать явно во втором и третьем параметре.
// подряд удвоенный ограничитель означает соответствующий символ в сторке.
//-----------------------------------------------------------------------------
function csv_convert_line($line, $sep = ';', $quo = '"')
{
$line = rtrim($line, "\r\n");
// если версия PHP < 4.1
// while(($last = substr($line, -1,1)) == '\n' || $last == '\r')
// $line = substr($line, 0, -1);
$row = array();
$pos = 0;
$len = strlen($line);
$in_quotes = 0;
$field = ''; // строка пока пуста
for(;;)
{
$qix = strpos($line, $quo, $pos); // ищем кавычку
if($qix === false) $qix = $len;
if(!$in_quotes)
{
if($qix < $len && $qix == $pos) // тут же встретилась кавычка
{
$in_quotes = 1; // значит это открывающая кавычка
++$pos; // пропустим
}
else
{
$six = strpos($line, $sep, $pos); // поищем запятую
if($six === false) $six = $len;
if($six > $pos) // добавим остаток стороки, если не пусто
$field .= substr($line, $pos, $six-$pos);
$row[] = $field; // формируем еще одно поле
$pos = $six;
if($pos >= $len)
break;
$field = '';
++$pos; // пропустим запятую и проверим очередную колонку
}
}
else
{
if($qix > $pos)
$field .= substr($line, $pos, $qix-$pos); // добавим кусочек
$pos = $qix;
if($pos >= $len)
break;
++$pos; // нашли кавычку
if($pos < $len && $line[$pos] == $quo) // это удвоенная кавычка
{
$field .= '"'; // учтем в поле
++$pos;
if($pos >= $len) // если строка кончилась, значит закрывающей
$in_quotes=0; // кавычки мы не дождемся.
}
else // значит мы добрались до закрывающей кавычки
$in_quotes = 0;
}
}
return $row;
}
?>
<form method=post enctype="multipart/form-data" >
csv convertor <input type=file name=csv />
<br><input type=submit /> </form>
|
| |
|
|
|
|
|
|
|
для: elenaki
(07.04.2006 в 16:33)
| | это заказчику надо =)) а у него такой вот CSV.. | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 16:19)
| | а создать scv с другим разделителем полей? не точка с запятой, а tab. | |
|
|
|
|
|
|
|
для: elenaki
(07.04.2006 в 16:16)
| | =) не мне такое не потходит.. | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 16:14)
| | дык, а я и не сказала, что я решила... я у себя меняла ; внутри текста на ? | |
|
|
|
|
|
|
|
для: elenaki
(07.04.2006 в 16:11)
| | э.. так а где тут проверка на лишнии точки с запятыми? | |
|
|
|
|