[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с заменой перевода строк в CSV файле
Tamplier
Нужно сделать импорт данных через csv. Формат csv из MS Excel - каждая новая запись начинается с новой строки, между собой ячейки разбиты символом ";", если внутри ячейки встречается символ ; или перевод строки - все содержимое ячейки берется в двойные кавычки.
При загрузке в ПХП я пытаюсь закавыченные символы перевода строки заменить на <br> при помощи регекспы:

$file=file_get_contents($FileName);
$file=preg_replace("{\"([^\"]*)\n([^\"]*)\"}","\"$1<br>$2\"",$file); //заменяем разрывы строк внутри литералов

Вроде как должны заменяться только те переводы строки которые внутри кавычек. Но проблема в том, что последнюю кавычку первой строки он может воспринимать как первую кавычку следующей - соответственно все строки с кавычками после первой приклеиваются к предыдущим. Как исправить это, чтобы кавычки искались ТОЛЬКО парами?




Спустя 12 часов, 31 минута, 20 секунд (25.11.2009 - 06:42) Ulanych написал(а):
На мой взгляд, самое простое решение - это обрабатывать файл посторочно, а потом конкатенировать строки. Проблема просто перестанет существовать.

Спустя 7 часов, 25 минут, 36 секунд (25.11.2009 - 14:07) Tamplier написал(а):
Так это надо сканировать каждую строку на кавычки?

Спустя 3 часа, 21 минута, 5 секунд (25.11.2009 - 17:28) Ulanych написал(а):
Ну да, каждую строку. А чего тут такого? Лично я, когда использую *.CSV файлы, считываю файл построчно и обрабатываю в цикле каждую строку. С моей точки зрения это проще.

$file = 'path_to_file)'; // путь к файлу
$fp = fopen("$file", 'rb');
if (!$fp)
{
throw new Exception('Не удалось открыть файл!'); // обработка исключения или ошибки
}
// циклом WHILE выполнять действия, пока не будет достигнут конец файла
while (!feof($fp))
{
// читать файл посторочно функцией fgetcsv() и обрабатывать так, как нужно
$arr_one_str = fgetcsv($fp, 500, ";"); // одна строка из файла
}

т.е. я бы рекомендовал использовать функцию fgetcsv()

Спустя 59 минут, 39 секунд (25.11.2009 - 18:28) Tamplier написал(а):
fgetcsv не обработает мне строку, в которой в данных могут быть переводы строк и символы разделителя.
На данный момент я сделал так:
function importcsv($f, $length, $d=";", $q='"') {
global $log;
$list = array();
$st = fgets($f, $length);
if ($st === false || $st === null){
$errinf=error_get_last();
$log[]="Ошибка чтения файла:$errinf[message]";
return false;
}
while (!empty($st)) {
if ($st[0] !== $q) {
# Non-quoted.
list ($field,$st) = explode($d, $st, 2);
} else {
# Quoted field.
$st = substr($st, 1);
$field = "";
while (1) {
# Find until finishing quote (EXCLUDING) or eol (including)
preg_match("/^((?:[^$q]+|$q$q)*)/sx", $st, $p);
$part = $p[1];
$partlen = strlen($part);
$st = substr($st, strlen($p[0]));
$field .= str_replace($q.$q, $q, $part);
if (strlen($st) && $st[0] === $q) {
# Found finishing quote.
list ($dummy,$st) = explode($d, $st, 2);
break;
} else {
# No finishing quote - newline.
$st = fgets($f, $length);
}
}

}

$list[] = $field;
}
return $list;
}

Может кто-то знает решение проще или эффективнее?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.