не загружаются все данные (feeds import)

Главные вкладки

Аватар пользователя владимирович владимирович 9 ноября 2012 в 19:04

Посоветуйте, пожалуйста, какое-нибудь решение. Нужно импортировать порядка 15 тыс. нод с 12 полями (файлы - csv). Первые разы все загрузилось нормально, но после последующих удалений/загрузок Feeds перестал нормально работать – часть данных не загружается (в некоторых полях отсутствуют нужные данные), ноды создаются. Пробовал по-разному, на локальной машине, разбил файлы по 250 нод – всё равно данные полностью не загружаются. Ошибок не выдает. Есть ли какое-нибудь решение, пусть долго импортируется, но надежно?

Комментарии

Аватар пользователя владимирович владимирович 10 ноября 2012 в 17:40

Проблема, как я понимаю, в том, что есть числовые поля с пустыми и нулевыми значениями. Теперь даже если попытаться импортировать файл без пустых и нулевых значений, Feeds работает некорректно. Значения загружаются не верно. У других модулей такая же проблема или это специфика Feeds?

Аватар пользователя DenisVS DenisVS 28 декабря 2012 в 13:29

Тоже актуальна альтернатива.
У меня такой CSV:
текст;текст;текст;текст;текст;html;html

Почему-то, как бы я не извращался, две последние ячейки лезут в одно поле. Разделителей в тексте нет, пробовал брать в кавычки — один хрен.

Есть обходной путь, замнить угловые скобки на условные последовательности (в прошлый раз делал #.;# вместо ;), а потом прогнать базу через sed. Но в этот раз на сайт будет периодически добавляться информация, поэтому не вариант. Нужно стабильно рабочее решение без извратов.

Аватар пользователя DenisVS DenisVS 28 декабря 2012 в 15:08

В общем, надо выкинуть встроенный парсер и использовать PHP-шный.

*Файл
sites/all/modules/feeds/libraries/ParserCSV.inc

*Закомментировать строки с
// The actual parser. explode() is unfortunately not suitable because the

*По
// in the $fields array.

*Добавить после
$fields = str_getcsv($line, $this->delimiter, '','\\');

Всё, теперь корректно обрабатывается любой текст.

Тут возникает простор для разных вариаций. Например, разделитель можно поставить от фонаря:
$fields = str_getcsv($line, '|', '', '\\');
Либо символ экранирования использовать стандартный (\)
$fields = str_getcsv($line, $this->delimiter, '');