PHP 5.3 fgetcsv \"

Я импортирую CSV из DB2 в MySQL, все идет хорошо, пока полмиллиона строк не сталкиваюсь с \" из столбца с зашифрованными данными.

Вот пример:

100,"foo","bar","µ┬;¬µ┬;→ºµ┬;Öì\"
101,"foo","bar","$⌠ù¶∙$∙µ┬µ┬;→ºµ┬;Öì"

Когда fgetcsv анализирует это, он избегает последней двойной кавычки и включает следующую строку, как если бы она была частью этого поля.

Я вижу несколько отчетов об ошибках, и в PHP 5.3 они добавили escape-параметр для fgetcsv.

Что DB2 использует в качестве побега? Просто "?


person somedev    schedule 27.10.2010    source источник
comment
На самом деле я не могу установить escape-символ в пустую строку, так как это должен быть один символ.   -  person somedev    schedule 27.10.2010
comment
Может быть, использовать chr(0) в качестве escape-символа?   -  person Alin Purcaru    schedule 27.10.2010
comment
Отличное предложение, Алин, я думаю, это тоже может сработать. Я пытаюсь еще раз импортировать в качестве escape-символа, пока все идет хорошо.   -  person somedev    schedule 27.10.2010


Ответы (1)


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

Вот ссылка на один из них: http://us3.php.net/manual/en/function.fgetcsv.php#98800

person tplaner    schedule 27.10.2010
comment
Да, я пробовал это до того, как пришел сюда, этот файл также содержит двоичные данные, и, похоже, он ломается, когда я использую эту функцию по какой-либо причине. Кроме того, он выдает много уведомлений, потому что не устанавливает поле перед добавлением, просто беспорядочно. - person somedev; 27.10.2010
comment
Честно говоря, я не уверен, действительно ли вы хотите использовать PHP в качестве инструмента миграции базы данных. Вы можете поискать реальные наборы инструментов для миграции. - person tplaner; 27.10.2010
comment
Справедливо, особенно с незнакомой dbms. Только что понял, что эти временные метки имеют микровремя. - person somedev; 28.10.2010
comment
fgetcsv() — это катастрофа. И предложение в комментариях к функциям, на которые вы ссылались, к сожалению, не сработало для меня. Не уверен, почему что-то не стабильное. Никогда не было таких проблем на Rails. - person Ain Tohvri; 06.03.2013