Я использую PHP для импорта CSV-файла, который берется из таблицы Excel. Некоторые из полей содержат разрывы строк в них, поэтому, когда я снова открываю таблицу csv в excel / open office, он неправильно истолковывает, где происходит разрыв строки.
Кроме того, в моем скрипте, используя fgetcsv для прохождения каждой строки, он неправильно разбивается на строки, где это не должно быть.
Я мог бы вручную очистить данные, но а), которые потребуют возраста в качестве файла строки 10 тыс., И б) данные будут экспортированы из клиентской существующей части программного обеспечения
Любые идеи о том, как автоматически решить эту проблему в процессе импорта? Я бы подумал, что разграничение полей будет сортировать, но это не так.
У меня тоже была эта проблема, и я не нашел способ правильно прочитать данные.
В моем случае это был разовый импорт, поэтому я создал скрипт, который искал все разрывы строк внутри столбца и заменил его на что-то вроде #####
. Затем я импортировал данные и заменил их на строки.
Если вам нужен регулярный импорт, вы можете написать собственный CSV-Parser, который справится с этой проблемой. Если текстовые столбцы находятся внутри ""
вы можете рассматривать все между двумя ""
как один столбец (с проверкой на экранирование "
внутри содержимого.
Принятый ответ не решил проблему для меня, но в итоге я нашел эту библиотеку парсеров CSV в коде google, который хорошо работает для многострочных полей в CSV.
parsecsv-for-php: http://code.google.com/p/parsecsv-for-php/
Мое решение таково:
nl2br(string);
http://php.net/manual/en/function.nl2br.php
Как только вы дойдете до уровня отдельной ячейки (строки), запустите его в строке, и он преобразует разрывы строк в html breaks для вас.
Да, вам нужно найти эту запятую и заменить некоторые специальные символы, такие как комбинация {()}
и, наконец, заменить их ,
которые вы изначально ищете.
Надеюсь, что это поможет тебе.
Хотя это старый вопрос, ответ может по-прежнему иметь отношение к ppl. В настоящее время существует новая библиотека (независимая от структуры) http://csv.thephpleague.com/, которая поддерживает символы NL в полях, а также некоторую фильтрацию.
Это старый поток, но я столкнулся с этой проблемой, и я решил ее с помощью регулярного выражения, чтобы вы могли избежать библиотеки только для этого. Здесь код находится на PHP, но он может быть адаптирован к другому языку.
$parsedCSV = preg_replace('/(,|\n|^)"(?:([^\n"]*)\n([^\n"]*))*"/', '$1"$2 $3"', $parsedCSV);
Эти решения предполагают, что поля, содержащие разрыв строки, заключаются в двойные кавычки, что, по-видимому, является допустимым предположением, по крайней мере, для того, что я видел до сих пор. Кроме того, двойные кавычки должны следовать или быть размещены в начале новой строки (или первой строки).
Пример:
field1,"field2-part1\nfield2-part2",field3
Здесь \ n заменяется пробелом, поэтому результатом будет:
field1,"field2-part1 field2-part2",field3
Регулярное выражение также должно обрабатывать несколько разрывов строк.
Это может быть неэффективно, если содержимое слишком велико, но оно может помочь во многих случаях, и идея может быть использована повторно, возможно, оптимизирована, делая это для небольших фрагментов (но вам нужно будет обрабатывать разрезы с буфером фиксированного размера) ,