|
|
|
| Чтото я никак не могу допересть как произволится обход тех точек с запятой, которые стоят просто в тексте от тех, которые разделяют.. | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 15:40)
| | может экранируют? | |
|
|
|
|
|
|
|
для: Loki
(07.04.2006 в 15:42)
| | в CSV не применяется экранирование.
Разве только вот кавычки, встречающиеся в тексте - удваивают, чтобы отличить от кавычки -ограничителя текстового поля. | |
|
|
|
|
|
|
|
для: Loki
(07.04.2006 в 15:42)
| | большая проблема. тоже с этим сталкивалась. у нас хуже - в греческом языке вместо ?
используется точка с запятой. а мне надо было перенести базу книг с аннотациями. там
была куча этих точек с запятыми...
экранировать - это хорошо. но это надо делать ДО создания scv, еще в Экселе. сделать
замену всех ; на ... что? я-то меняла на ?, хоть это и неправильно грамматически. а в
русском на что менять? на точку? HO ведь даже, если мы поставим впереди ; какой-то символ,
сам знак-то останется и будет выглядеть так же как и разделители полей. можно поля
разделять другим символом - табом, например. а в PHP строки разбивать по \t | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 15:40)
| | ; которые стоят в тексте заключены в кавычки вместе с текстом. А разделяющие - нет. | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2006 в 15:45)
| | а как их различать?
Если можно то напишите код, чтобы он разюивал строку на переменные и засовывал всё в массив | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 16:06)
| |
filename = "hotels.txt";
// otkrivaem
$file = fopen($filename, "r");
// chitaem
$buffer = fread($file, filesize($filename));
// zakrivaem
fclose($file);
// delaem massiv iz stroki dannix
$file_array = explode("\n", $buffer);
//nachalo perebora massiva
foreach ($file_array as $line_num => $line) {
$line_exp = explode(";", $line);
$sqlquery = 'INSERT INTO hotels VALUES (';
$sqlquery .= '""'; // id
$sqlquery .= ',"'.addslashes($line_exp[5]) . '"'; //hotel name
$sqlquery .= ',"'.$line_exp[8] . '"'; // class
$sqlquery .= ',"'.addslashes($line_exp[15]) . '"'; // adress
$sqlquery .= ',"'.$line_exp[13]. '"'; //area
$sqlquery .= ',"'.$line_exp[11]. '"'; //perif
$sqlquery .= ',"'.$line_exp[10]. '"'; //nomos
$sqlquery .= ',"'.$line_exp[17]. '"'; //tel
$sqlquery .= ',"'.$line_exp[18]. '"'; //fax
$sqlquery .= ',"'.$line_exp[2]. '"'; //email
$sqlquery .= ',"'.$line_exp[21]. '"'; //rooms
$sqlquery .= ',"'.$line_exp[22]. '"'; //beds
$sqlquery .= ')';
//echo $sqlquery.";<br>"; /// echo - for test
$result = mysql_query($sqlquery) or die(" $sqlquery <b>failed!</b><br>".mysql_error());
}
|
| |
|
|
|
|
|
|
|
для: elenaki
(07.04.2006 в 16:11)
| | э.. так а где тут проверка на лишнии точки с запятыми? | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 16:14)
| | дык, а я и не сказала, что я решила... я у себя меняла ; внутри текста на ? | |
|
|
|
|
|
|
|
для: elenaki
(07.04.2006 в 16:16)
| | =) не мне такое не потходит.. | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 16:19)
| | а создать scv с другим разделителем полей? не точка с запятой, а tab. | |
|
|
|
|
|
|
|
для: elenaki
(07.04.2006 в 16:33)
| | это заказчику надо =)) а у него такой вот CSV.. | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: Trianon
(07.04.2006 в 20:39)
| | счас заценю =)) | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2006 в 20:39)
| | Cheops! Как насчет варианта того же самого на базе preg_match?
Только чур с Фридла не списывать :)) | |
|
|
|
|
|
|
|
для: Trianon
(07.04.2006 в 20:44)
| | Мне кажется эта задача не совсем удобна для регулярных выражений, так как число полей заранее не известно. Его наверное можно составить, но получится очень сложное...
PS Во Фридла лишний раз лазить не следует - черезвычайно занудное чтение :))) | |
|
|
|
|
|
|
|
для: krollik
(07.04.2006 в 15:40)
| | А вы посмотрите в скрите http://www.softtime.ru/info/csv.php, как там решается эта проблема. | |
|
|
|