CSV без кавычек не работает с fgetcsv

Я пытаюсь разобрать файлы CSV, загруженные пользователем через PHP, но это не работает должным образом.

Я загрузил несколько правильно отформатированных CSV-файлов, и все работало нормально; Многие пользователи пытаются импортировать CSV-файлы, экспортированные из Excel, и у них возникают проблемы. Я сравнил файлы со своими и заметил, что во всех файлах Excel отсутствуют кавычки вокруг записей. Кроме того, они идентичны. Если я открою его и сохраню с помощью Open Office, вообще не внося никаких изменений, он работает. Так что я вполне уверен, что это связано с цитатами.

Мой вопрос; как мне прочитать эти неправильно отформатированные CSV?

ОБНОВЛЕНИЕ: Причина найдена!

Это характерно для версии Excel для Mac. Разрывы строк по какой-то произвольной причине обрабатываются на Mac по-разному, поэтому перед использованием fgetcsv вы должны сделать это;

ini_set('auto_detect_line_endings',TRUE);

person Stephen Belanger    schedule 23.02.2010    source источник
comment
Можете ли вы показать нам свой код и сказать нам, в чем проблема? Мы используем fgetcsv() без проблем, независимо от форматирования.   -  person jasonbar    schedule 23.02.2010
comment
Спасибо этому чуваку!! спасатель   -  person Mike Waites    schedule 09.06.2011


Ответы (2)


Это характерно для версии Excel для Mac. Разрывы строк по какой-то произвольной причине обрабатываются на Mac по-разному, поэтому перед использованием fgetcsv вы должны сделать это;

ini_set('auto_detect_line_endings',TRUE);
person Stephen Belanger    schedule 09.03.2010
comment
Черт. Потрясающий. Находить. - person Stegrex; 08.07.2014

Глядя на страницу руководства fgetcsv, ее прототип выглядит так:

array fgetcsv  ( resource $handle  [, int $length  
    [, string $delimiter = ','  [, string $enclosure = '"' 
    [, string $escape = '\\'  ]]]] )

Значение по умолчанию для $enclosure (т. е. 4-го параметра) — это двойные кавычки.

Что, если вы попытаетесь указать, что вам не нужен какой-либо корпус, указав пустую строку для этого 4-го параметра?

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

person Pascal MARTIN    schedule 23.02.2010
comment
Да, я видел это. Но, как вы сказали, это ломает то, что в настоящее время работает. Нет ли простого способа проверить, в каком формате он хранится, и соответствующим образом изменить поведение? - person Stephen Belanger; 23.02.2010
comment
Я полагаю, что какое-то регулярное выражение позволит вам определить, в каком формате находится файл ;; другим решением было бы всегда пробовать первое (наиболее распространенное) решение, а если оно не работает, пробовать второе ;; учитывая, что все строки вашего файла, вероятно, отформатированы одинаково, выполнения теста только для первой строки должно быть достаточно, что означает, что вы сделаете только 1 бесполезный вызов fgetcsv. - person Pascal MARTIN; 23.02.2010