PHP fgetcsv () не читает все строки - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть php-скрипт, который читает удаленный CSV-файл и добавляет продукты в базу данных на основе содержимого CSV-файла.В настоящее время существует около 2800 строк (продуктов), но скрипт останавливается на строке 1388.

Я использовал следующий код:

while(($data = fgetcsv($fopen, 0, ",")) !== false):
  //stuff is done here...
endwhile;

Я установил предел памяти php равным64М и даже попробовал 128М.Я также установил max_execution_time на 60 минут.Я также попытался изменить код следующим образом:

while(($data = fgetcsv($fopen, 1000, ",", '\r')) !== false):
  //stuff is done here...
endwhile;

Это привело к тому, что больше строк было проанализировано, НО тогда данные были неправильными, то есть столбцы изображения становились столбцами описания и т. Д. Я предполагаю, что это должно сделатьс добавлением \ r в качестве окончания моей строки.Я пытался \ n, не повезло.Наконец, я также добавил auto_detect_line_endings как true в ini.

Кто-нибудь может подсказать причины, по которым мои данные обрезаются?

С уважением, Саймон

РЕДАКТИРОВАТЬ

Я заметил кое-что интересное.У меня есть вставка MySQL в каждой строке, которая зацикливается в приведенном выше коде.Теперь, последняя запись в моей базе данных - это ПЕРВАЯ строка в CSV-файле. Означает ли это, что файл анализируется с последней строки вверх?

W-3066,  I Love Love Cheap And Chic,     Moschino, 3.4 oz,EDT Spray,Women,,"Introduced by the design house of Moschino, I love love has a blend of grapefruit, orange, lemon, red currant, tea rose, cinnamon leaves, musk, cedar and tonka wood. It is recommended for daytime wear.",http://www.perfume-worldwide.com/products/Women/Final/W-3066large.jpg,0,0,0,8011003991457
W-3070,  Adidas Floral Dream,            Adidas,   1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are bergamot, lily, rose, tonka bean and vanilla.",http://www.perfume-worldwide.com/products/Women/Final/W-3070large.jpg,0,0,0,3412244310024
W-3071,  Adidas Fruity Rhythm,           Adidas,   1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are black currant, raspberry, cyclamen, freesia and musk.",http://www.perfume-worldwide.com/products/Women/Final/W-3071large.jpg,0,0,0,3412244510004

РЕШЕНИЕ

Как оказалось, мне гораздо лучше скопировать файл на сервер и отработатькопия.Я следовал следующим шагам:

  • Я прочитал содержимое удаленного файла, используя file_get_contents()
  • Я затем использовал функцию iconv() для перекодирования данных в UTF-8
  • Я сделал временный файл, используя функции fopen(), fwrite() и fclose(), содержимое файла было закодированными данными выше
  • Я установил права доступа к файлу на0750 с использованием функции chmod()
  • Затем я применил функцию fgetcsv() к моему временному файлу
  • Сделал все, что нужно было сделать
  • Удалил временный файл после завершения, используя unlink() функцию

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

Спасибо всем за все подталкивания в правильном направлении

Ответы [ 2 ]

2 голосов
/ 07 апреля 2011

Во-первых, у меня есть к вам несколько вопросов:

  • Что находится на линии 1388 , 1388 и 1389
  • Есть ли какие-либо ошибки, выводимые
  • Когда вы достигнете последней линии, вы получите ($data[0] === null)

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

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

Файл CSV должен быть достаточно структурирован, чтобы fgetcsv мог правильно его проанализировать, и некоторые правила, которые следует помнить при использовании файлов CSV:

  • В первой строке всегда должны быть имена столбцов
  • Все остальные строки являются строками данных:
    • Каждый элемент должен быть разделен ,
    • Если элемент содержит пробел или запятую, '\n', '\r', '\r\n', его следует заключить в двойные кавычки

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

id, firstname, lastname, age, profile_description
0,  Robert,    Pitt,     22,  "this string has spaces, and has a comma"

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

2 голосов
/ 07 апреля 2011

файл правильно отформатирован? Вы пытались открыть файл в каком-нибудь CSV-ридере, в котором вы можете указать разделители и конечные строки)? Судя по этому:

Это привело к тому, что было проанализировано больше строк, НО тогда данные были неверными, то есть столбцы изображений становились столбцами описания и т. Д.

Я бы предположил, что данные, возможно, повреждены (т. Е. Некоторые описания содержат запятую, конечную строку и т. Д.). Это срабатывает, если данные генерируются динамически и не отформатированы правильно.

также откройте в текстовом редакторе (например, блокнот ++) и посмотрите, как это выглядит / выглядит ..

...