Импорт CSV с разрывами строк в реальных полях

Я использую 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

Регулярное выражение также должно обрабатывать несколько разрывов строк.

Это может быть неэффективно, если содержимое слишком велико, но оно может помочь во многих случаях, и идея может быть использована повторно, возможно, оптимизирована, делая это для небольших фрагментов (но вам нужно будет обрабатывать разрезы с буфером фиксированного размера) ,