2012-03-07 3 views
3

У меня есть следующий код:fgetcsv возвращает слишком много записей

while (!feof($file)) { 
     $arrayOfIdToBodyPart = fgetcsv($file,0, "\t"); 
      if (count($arrayOfIdToBodyPart)==2){ 

проблема, содержимое файла выглядеть следующим образом:

39  ankle 
40  tibia 
41  Vastus Intermedius 

и так далее

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

Это приводит к отказу блока if, и мне грустно. Я знаю, что могу просто сделать if block test для> = 2, но есть ли способ, которым я могу заставить его просто признать факт, что есть два элемента? Мне не нравится, что fgetcsv находит «загадочных» персонажей в конце строки.

Возможно, это unix-сервер, на котором установлена ​​ошибка на основе Windows? Если это так, и я запускаю сервер ubuntu без dos2unix, где я его получу?

+1

+1 для эмоциональной реакции на проблемы в коде/данных – thetaiko

+0

Попробуйте выполнить [hex dump] (http://en.wikipedia.org/wiki/Hex_editor) файла CSV, чтобы узнать, соответствует ли содержимое файла вашему ожидания; фактическое содержание может отличаться от ваших исходных предположений. Для этого нужно сделать что-то вроде шестнадцатеричного редактора вместо текстового редактора, так как последнее не всегда будет различать байты, которые PHP определенно обрабатывает по-разному. –

+0

Мое предположение - CR-символы (\ r) перед символом NL (\ n). Используйте 'dos2unix filename', чтобы очистить их. Удачи. – shellter

ответ

0

Вы, вероятно, есть вкладки в конце строки:

value<tab>value<tab><newline> 

Если это так, dos2unix не поможет. Возможно, вам придется сделать что-то вроде чтения каждой строки в переменной, trim(), а затем использовать str_getcsv(), чтобы разделить ее.

0

Возможно ли, что у вас есть вкладка в конце этих строк? Они невидимы и часто трудно обнаружить ... вы можете дважды проверить.

Кроме того, если вы работаете с CSV файлов, в то время как вы работаете окна локально и сервер Unix, я нашел эту строку:

ini_set('auto_detect_line_endings', true); 

экономит много головной боли.

Смежные вопросы