ответ, но с использованием блока временной памяти (а не записи на диск) для повышения производительности:

отрим файл CSV вот так

item1,"description 1"
item2,"description 2"
item3,"description 3
description 3 continues on new line"
item4,"description 4"

который нужно разобрать вот так

item1,"description 1"
item2,"description 2"
item3,"description 3 description 3 continues on new line"
item4,"description 4"

Есть ли способ проанализировать этот CSV в PHP, который имеет многострочные значения?

 Linus Kleen19 янв. 2011 г., 08:58
Написать парсер?
 Bart Kiers19 янв. 2011 г., 09:18
@goreSplatter, или просто используйте существующий.
 Linus Kleen19 янв. 2011 г., 09:21
@ Барт Извините, я упустил другое очевидное решение.
 outis26 дек. 2011 г., 08:36
возможный дубликатразобрать CSV файл php

Ответы на вопрос(3)

На основеStanleyD ответ, но с использованием блока временной памяти (а не записи на диск) для повышения производительности:

$fp = fopen('php://temp','r+');
fwrite($fp, $CsvString);
rewind($fp); //rewind to process CSV
while (($row = fgetcsv($fp, 0)) !== FALSE) {
    print_r($row);
}
Решение Вопроса

fgetcsv должен быть в состоянии правильно разобрать это.
В любом случае, я бы не советовал делать это вручную, есть много таких ошибок в разборе CSV.

 Ergec19 янв. 2011 г., 13:50
Проблема в том, что я использовал fgets для чтения строки из файла, а затем str_getcsv для анализа строки вместо использования только fgetcsv. Это работало хорошо с однострочными столбцами, но не многострочными. Даже жесткий PHP.net говорит, что fgetcsv «получает строку из файла» кажется, что «строка» здесь - это не фактическая строка в текстовом файле, а целая строка со всеми многострочными данными.
 Raoul25 мар. 2013 г., 13:22
Я пришел с той же проблемой сегодня и сделал немногоконтрольная работа, что доказывает ваше утверждение олинии ссылаясь наCSV-строк а не актуальнофайл-линии.
 Erfan19 дек. 2018 г., 04:33
Я надеялся использоватьstr_getcsv поскольку он не должен загружать весь файл в память, только строка, которая красного цвета.fgetcsv работает с многострочными полями CSV, ноstr_getcsv по-видимому, нет.
 deceze♦19 дек. 2018 г., 07:26
@Erfanfgetcsv также читает только одну строку за раз из дескриптора открытого файла… !?

CSV в строковой переменной $ CsvString:

$fp = tmpfile();
fwrite($fp, $CsvString);
rewind($fp); //rewind to process CSV
while (($row = fgetcsv($fp, 0)) !== FALSE) {
    print_r($row);
}

CSV в файле:

if (($handle = fopen("test.csv", "r")) !== FALSE) {
  while (($row = fgetcsv($handle, 0, ",")) !== FALSE) {
    print_r($row);
  }
  fclose($handle);
}
 csga500030 мая 2015 г., 23:30
Отличный ответ. У меня есть CSV, загруженные пользователем с окончанием строки (я понятия не имею, почему), и мне пришлось strreplace перед анализом CSV. Так как str_getcsv не обрабатывает несколько строк, и в некоторых строках есть новые строки, это работает (хотя и хакерски, помещая материал во временный файл только для того, чтобы PHP его проанализировал).

Ваш ответ на вопрос