2010-02-23 7 views
12

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

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

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

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

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

ini_set('auto_detect_line_endings',TRUE); 
+0

Можете ли вы показать нам свой код и сообщить нам, в чем проблема? Мы используем fgetcsv() без проблем, независимо от форматирования. – jasonbar

+0

Спасибо за этого чувака !! спасатель жизни –

ответ

22

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

ini_set('auto_detect_line_endings',TRUE); 
+0

спасибо! работает отлично. – tbradley22

+0

Freaking. Потрясающие. Найти. – Stegrex

1

Глядя на manual page of fgetcsv, его прототип выглядит следующим образом:

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

Значение по умолчанию для $enclosure(то есть четвёртое параметр) является двойной кавычки.

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

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

+0

Да, я это видел. Но, как вы сказали, это нарушает то, что в настоящее время работает. Нет ли простого способа проверить, в каком формате он хранится, и правильно ли изменить поведение? –

+0

Я предполагаю, что некоторое регулярное выражение позволит вам определить, в каком формате находится файл ;; другим решением было бы всегда попробовать первый * (наиболее часто используемый случай) * решение, и, если он не работает, попробуйте второй ;; учитывая, что все строки вашего файла, вероятно, сформированы одинаково, выполнение теста только для первой строки должно быть достаточно - это означает, что вы делаете только 1 бесполезный вызов 'fgetcsv'. –

+0

Я пробовал, что получается, пустые шкафы не работают ... –