анализ csv (данные, заключенные в кавычки) с использованием fgetcsv() не работает должным образом

Я пытаюсь разобрать файл csv, в котором мои данные указаны в формате, например:

"Total","Shazam (DE)","Total",,"215,611","538","£935.97","£60.77"

Теперь, если я передам fgetcsv(), как показано ниже:

$values = fgetcsv($f,8098);

Он возвращает мне массив как:

array(9) {
  [0]=>
    string(15) ""Total""
  [1]=>
    string(27) ""Shazam (DE)""
  [2]=>
    string(15) ""Total""
  [3]=>
    string(1) ""
  [4]=>
    string(9) ""215"
  [5]=>
    string(9) "611""
  [6]=>
    string(11) ""538""
  [7]=>
    string(19) ""£935.97""
  [8]=>
    string(19) ""£60.77"
 "
 }

но теперь, если я даю оператор if, например:

 $values = fgetcsv($f,8098);
 if ($values[0] == "Total")
   echo "Hello";

ничего не повторяется, почему условие не выполняется? Это как-то связано с заключенными в кавычки?

Я даже пытался экранировать кавычки, например .

 if ($values[0] == '\"Total\"')
   echo "Hello";

но бесполезно.

Нужно ли для этого изменить какие-либо настройки .ini? Пожалуйста помогите.

РЕДАКТИРОВАТЬ: я попытался сделать var_dump, и он показал мои значения, содержащие кавычки:

 array(9) {
  [0]=>
   string(15) ""Total""
 [1]=>
   string(27) ""Shazam (DE)""
 [2]=>
   string(15) ""Total""
 [3]=>
   string(1) ""
 ...
}

но даже

$values[0] == "\"Total\""

не работал. Каким должен быть правильный компаратор?

ОБНОВЛЕНИЕ: после нескольких часов бесцельных проб и ошибок, наконец, нашел что-то раздражающее, но это решило мою проблему.

Первоначально, когда я пытался открыть свой CSV-файл, он открывал блокнот с ÿþD"" в качестве содержимого. Что я сделал, так это скопировал все содержимое файла и создал новый CSV-файл с тем же именем, и, к моему удивлению, это сработало.

Старый файл хорошо открывался в MS-EXCEL/NOTEPAD, но в excel каждая строка отображалась внутри одной ячейки.

Мой вопрос: в чем проблема с файлом .csv? Кто-нибудь уже сталкивался с такой проблемой?


person deGee    schedule 28.11.2011    source источник
comment
Однажды я целый день кричал на свой компьютер из-за чего-то подобного, и оказалось, что fgetcsv() возвращает NULL по причине, которую я так и не понял, когда я добавил явно не связанный if. Я предположил, что это ошибка fgetcsv() или, возможно, Zend (возможно, она уже исправлена, это было в PHP4). В конце концов мне пришлось написать свою собственную замену функции fgetcsv() для исправления. Попробуйте var_dump($values) и убедитесь, что он действительно содержит данные.   -  person DaveRandom    schedule 28.11.2011
comment
Почему бы вам не включить результат var_dump вместо print_r ?   -  person ajreal    schedule 28.11.2011


Ответы (1)


Я думаю, вам нужно определить квалификатор текста, это называется вложением в fgetcsv. например:

$values = fgetcsv($f,8098,'"'); 
// the last part is: singlequote doublequote singlequote,
// you could also use an escape "\"" 

Это говорит синтаксическому анализатору, что он не должен брать запятую внутри текстовой области.

Вы должны уметь:

$values[0] == '"Total"'

ОБНОВИТЬ:

Ваша проблема с открытием файла странно, вероятно, связана с кодировкой файлов, создав новый файл, вы создали его с новой кодировкой, возможно, ANSI/UTF-8/Unicode, что-то, чего не было в исходном файле, а затем скопировали туда содержимое , так что теперь он был сохранен в этом формате. Я не уверен, почему это может вызвать проблемы, с которыми вы сталкиваетесь, но я предполагаю, что синтаксический анализатор каким-то образом не может обработать неправильную кодировку.

попробуйте открыть блокнот и обратите внимание, что когда вы нажимаете «Сохранить как», вы можете выбрать кодировку внизу, попробуйте несколько разных файлов с другой кодировкой, если вы хотите убедиться, что это было так?

person Jim Wolff    schedule 28.11.2011
comment
Я также пытался добавить это поле приложения, но это не помогло. Оно по-прежнему действует таким же образом. - person deGee; 28.11.2011
comment
когда я смотрю на части 4 и 5 массива, похоже, что ошибка связана с заключением двойных кавычек, и в вашей проверке вы допустили ошибку, используя одинарные кавычки, а затем также избегая вашего итога, что означает, что он сравнивает это буквально: «Всего ' == '\Total\' они не равны - person Jim Wolff; 28.11.2011
comment
попробуйте $values[0] == \Total\ или $values[0] == 'Total' с вложениями, он может полностью удалить двойные кавычки, не использовал его, поэтому я не уверен, тогда это будет просто $values[0] = = 'Total' // я сделал это с одинарными кавычками, чтобы попытаться избежать путаницы, которая происходит с кавычками и управляющими символами - person Jim Wolff; 28.11.2011
comment
да ... спасибо @Frozen, это был действительно ценный вклад от вас. Извините за опоздание принять этот ответ - person deGee; 07.12.2011