импорт данных из csv файла

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

Аватар пользователя vgo vgo 9 декабря 2016 в 19:49

Drupal 7.52, использую Feeds. Еще у меня есть Feed Import, но он отключен.

1. Один csv файл я успешно ввел (в ноды). Но у меня не пошел ввод с разделителем TAB. Я посмотрел, как импортер экспортируется, и подумал, что этот разделитель вообще не работает. Я прав?

2. Не могу импортировать csv без уникального поля. Хотя друпал, вроде, не отказывается, только говорит, что чего-то делать не будет. Но он не делает вообще ничего! Есть какие-то особенные настройки, которые надо делать в таком импортере?

В этом импортере что-то не так?

$feeds_importer = new stdClass();
$feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
$feeds_importer->api_version = 1;
$feeds_importer->id = 'equip_move_import';
$feeds_importer->config = array(
  'name' => 'Оборудование: импорт перемещений',
  'description' => '',
  'fetcher' => array(
    'plugin_key' => 'FeedsFileFetcher',
    'config' => array(
      'allowed_extensions' => 'txt csv tsv xml opml',
      'delete_uploaded_file' => FALSE,
      'direct' => FALSE,
      'directory' => 'public://feeds',
      'allowed_schemes' => array(
        0 => 'public',
      ),
    ),
  ),
  'parser' => array(
    'plugin_key' => 'FeedsCSVParser',
    'config' => array(
      'delimiter' => '|',
      'encoding' => 'Windows-1251',
      'no_headers' => 1,
    ),
  ),
  'processor' => array(
    'plugin_key' => 'FeedsNodeProcessor',
    'config' => array(
      'expire' => '-1',
      'author' => '0',
      'authorize' => 0,
      'mappings' => array(
        0 => array(
          'source' => '0',
          'target' => 'title',
          'unique' => FALSE,
          'language' => 'und',
        ),
        1 => array(
          'source' => '1',
          'target' => 'field_equipmovedate',
          'unique' => FALSE,
          'language' => 'und',
        ),
        2 => array(
          'source' => '2',
          'target' => 'field_equiploc',
          'term_search' => '0',
          'autocreate' => 1,
        ),
        3 => array(
          'source' => '3',
          'target' => 'field_equipresp',
          'term_search' => '0',
          'autocreate' => 1,
        ),
        4 => array(
          'source' => '4',
          'target' => 'field_user',
          'unique' => FALSE,
          'language' => 'und',
        ),
      ),
      'insert_new' => '1',
      'update_existing' => '0',
      'update_non_existent' => 'skip',
      'input_format' => 'plain_text',
      'skip_hash_check' => 0,
      'bundle' => 'equip_move',
      'language' => 'und',
    ),
  ),
  'content_type' => '',
  'update' => 0,
  'import_period' => '-1',
  'expire_period' => 3600,
  'import_on_create' => 0,
  'process_in_background' => 0,
);

Комментарии

Аватар пользователя vgo vgo 11 декабря 2016 в 12:05

Переформулирую вопрос:
нужно импортировать из csv массив данных в ноды, причем в импортируемых данных нет поля, которое можно использовать как unique.
Это возможно? и если возможно, то какими средствами?

Аватар пользователя DivaDii DivaDii 11 декабря 2016 в 17:38

Я импортирую csv на сайт.

Стала проверять - у меня нет поля с конфигурацией unique

Разделитель - ;

Но... в настройках синонимов урл поставила вот так:

type/[node:title]-[node:nid]

И всё прекрасно работает.

===

Что касается Вашего кода... - у меня подозрение по поводу кодировки.
Друпал кушает csv в кодировке UTF8, а не Windows-1251

Вот код моего импорта:

<?php$feeds_importer = new stdClass();
$feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
$feeds_importer->api_version = 1;
$feeds_importer->id = 'csv2aforizm';
$feeds_importer->config = array(
  'name' => 'csv2aforizm',
  'description' => 'csv2aforizm',
  'fetcher' => array(
    'plugin_key' => 'FeedsFileFetcher',
    'config' => array(
      'allowed_extensions' => 'txt csv tsv xml opml',
      'direct' => FALSE,
      'directory' => 'public://feeds',
      'allowed_schemes' => array(
        0 => 'public',
      ),
    ),
  ),
  'parser' => array(
    'plugin_key' => 'FeedsCSVParser',
    'config' => array(
      'delimiter' => ';',
      'no_headers' => 0,
    ),
  ),
  'processor' => array(
    'plugin_key' => 'FeedsNodeProcessor',
    'config' => array(
      'expire' => '-1',
      'author' => '1',
      'authorize' => 1,
      'mappings' => array(
        0 => array(
          'source' => 'Title',
          'target' => 'title',
          'unique' => 0,
        ),
        1 => array(
          'source' => 'Body',
          'target' => 'body',
          'unique' => FALSE,
        ),
        2 => array(
          'source' => 'Avtor',
          'target' => 'field_avtor',
          'unique' => FALSE,
        ),
      ),
      'update_existing' => '0',
      'input_format' => 'plain_text',
      'skip_hash_check' => 0,
      'bundle' => 'aphorizm',
    ),
  ),
  'content_type' => '',
  'update' => 0,
  'import_period' => '-1',
  'expire_period' => 3600,
  'import_on_create' => 1,
  'process_in_background' => 0,
);
?>
Аватар пользователя vgo vgo 12 декабря 2016 в 10:55

Спасибо.
Я внимательно сравнил наши импортеры и нашел несколько различий (кроме очевидных). Некоторые понятные, другие - странные.
По поводу pathauto у меня настройка похожая - equip/move/[node:title]/[node:nid]. Конечно, проверю, что изменится, если заменить слеш на другой символ.
Кодировку Windows-1251 друпал кушает однозначно, потому что другой массив данных у меня в этой кодировке импортировался благополучно. Но на всякий случай, проверю и UTF-8.
Теперь о расхождениях собственно в импортере.
Ну, названия импортера и полей - это само собой.

Самое загадочное расхождение: у Вас в 0 столбце указано 'unique' => 0,
а в других местах (а у меня - везде) указано 'unique' => FALSE.
Как Вы добились этого эффекта?

Кроме того, у меня есть, а у Вас отсутствуют строчки
'insert_new' => '1',
'update_non_existent' => 'skip',

и есть различие в строке 'import_on_create' =>

Постараюсь понять, какие для этого нужны настройки. Или это ручная правка?

PS. что-то получилось ))
После первой правки (кажется, это было всего-навсего 'unique' => 0 в 0 столбце - кстати, я понял, как это делается) картинка изменилась, но данные не импортировались.
Потом я еще побился... оно вело себя совсем правдоподобно, только данные не вводились.
Похоже, оно не хочет автозаполнять пустые словари таксономии. После того, как я ввел в них по одному термину, все сработало и я получил введенные данные и заполненные словари.

Спасибо за помощь.

Аватар пользователя DivaDii DivaDii 12 декабря 2016 в 12:30

vgo wrote:

Самое загадочное расхождение: у Вас в 0 столбце указано 'unique' => 0,

а в других местах (а у меня - везде) указано 'unique' => FALSE.

Как Вы добились этого эффекта?

НЕ ПОМНЮ. Smile
Это было давно.

Quote:

Постараюсь понять, какие для этого нужны настройки. Или это ручная правка?

Нет, ручной правки не было. Была настройка именно в стандартном интерфейсе импортера фидов.

Quote:

PS. что-то получилось ))

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

Ну так с таксономией ДЕЙСТВИТЕЛЬНО надо действовать по-другому.
Словари создавать легче, лучше, проще вручную.
Термины таксономии импортировать заранее.
И только потом - материалы с этими терминами.

Хотя, по идее, не могло это повлиять на неимпортирование материалов.
Если термина нет, то материал импортируется, термины в нём ВРОДЕ БЫ есть, но они не связаны со словарем; таксономия не будет адекватно работать.
хм... Кажется. Точно не помню. Smile

Кстати, обратите внимание на модуль Таксономия_Менеджер.
С его помощью очень просто стопку терминов загнать в словарь. НАМНОГО проще, чем настраивать импорт фида.

Аватар пользователя vgo vgo 12 декабря 2016 в 13:00

DivaDii wrote:

vgo написал:

Самое загадочное расхождение: у Вас в 0 столбце указано 'unique' => 0,


а в других местах (а у меня - везде) указано 'unique' => FALSE.


Как Вы добились этого эффекта?

НЕ ПОМНЮ. Smile

Это было давно.


Зато я теперь знаю )) эффект достигается включением поля в уникальное и обратно.
DivaDii wrote:

Цитата:

Постараюсь понять, какие для этого нужны настройки. Или это ручная правка?

Нет, ручной правки не было. Была настройка именно в стандартном интерфейсе импортера фидов.


Это все очень странно. Вероятно, разные версии? потому что у меня даже после экспорта - удаления этих строк - импорта обратно эти загадочные строчки все равно появились.
DivaDii wrote:

Цитата:

PS. что-то получилось ))


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

Ну так с таксономией ДЕЙСТВИТЕЛЬНО надо действовать по-другому.


Не обязательно )) теперь это уже медицинский факт. При правильной настройке словари чудненько заполняются импортируемыми данными. Плюсы очевидные:
а) меньше надо делать руками
б) если какой-то вариант случайно не ввели, данные будут импортированы. В противном случае, похоже, они будут молчаливо скипнуты. Даже если значение в поле было введено с ошибкой, найти в словаре новое кривое значение проще, чем потом искать источник ошибки.
DivaDii wrote:

Хотя, по идее, не могло это повлиять на неимпортирование материалов.

Если термина нет, то материал импортируется, термины в нём ВРОДЕ БЫ есть, но они не связаны со словарем; таксономия не будет адекватно работать.

хм... Кажется. Точно не помню. Smile

Это не могло повлиять, это точно повлияло. ((
Единственное, что разделяло неудачную и удачную попытки импорта было именно это - прописывание одного термина в каждый из словарей.
Остальные несколько десятков благополучно добавились в словари при импорте.
DivaDii wrote:

Кстати, обратите внимание на модуль Таксономия_Менеджер.

С его помощью очень просто стопку терминов загнать в словарь. НАМНОГО проще, чем настраивать импорт фида.


Обратил уже, правда, неудачно. Ссылочка "импортировать" у меня категорически не хотела появляться. И вообще интерфейс модуля выглядел не так, как на картинках.

Потом импортировал словарь с помощью чего-то вроде taxonomy csv import, сработало нормально, но это уже другая задача.

Аватар пользователя DivaDii DivaDii 12 декабря 2016 в 15:45

vgo wrote:

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

Варианты:
1. Обновленный модуль Фиид, а когда я настраивала свой импортер, то была более старая версия модуля.

2. Немножко разные настройки импортера.

В Менеджер таксономии не надо "импортировать". Там кнопка "+ Добавить" или "+ Add".

И туда просто столбик терминов вставляем.
Это реально ОЧЕНЬ просто.

Ну я рада, что у вас таки получилось.
Успехов.

Аватар пользователя vgo vgo 12 декабря 2016 в 16:15

1. гм... у меня, полагаю, как раз обновленные модуль, так он сам дописывает эти строки, даже если их не было. Ну да ладно.
2. Я пытался найти влияющие на это настройки импортера, менялось содержимое строки, но она всегда была.

По поводу менеджера таксономии хотелось бы разобраться. Я видел такую ссылку: http://cmspress.info/drupal/project/taxonomy_manager
На одном из скриншотов ссылка "импорт" присутствует, уж не знаю, что она делает. НО мне вообще не удалось увидеть ничего похожего на эти скриншоты, не было и ссылки.
Вы говорите о вводе копипастой? Ну вот поскольку я пробую технологии, хотелось бы именно импорт csv из файла получить. )) я его получил.

Спасибо.

Аватар пользователя DivaDii DivaDii 12 декабря 2016 в 19:58

vgo wrote:

1. гм... у меня, полагаю, как раз обновленные модуль, так он сам дописывает эти строки, даже если их не было. Ну да ладно.

2. Я пытался найти влияющие на это настройки импортера, менялось содержимое строки, но она всегда была.
По поводу менеджера таксономии хотелось бы разобраться. Я видел такую ссылку: http://cmspress.info/drupal/project/taxonomy_manager

На одном из скриншотов ссылка "импорт" присутствует, уж не знаю, что она делает. НО мне вообще не удалось увидеть ничего похожего на эти скриншоты, не было и ссылки.

Вы говорите о вводе копипастой? Ну вот поскольку я пробую технологии, хотелось бы именно импорт csv из файла получить. )) я его получил.
Спасибо.

Это именно этот модуль. Но на тех скриншотах я не вижу ссылки Импорт. Smile

Что касается копипаста...
Это же не по одному термину копировать. А сразу кучку. Хоть 30, хоть 100.

Я считаю, что в каждом случае лучше использовать самый простой способ.

Но... - хозяин - барин.

Аватар пользователя vgo vgo 13 декабря 2016 в 11:00

DivaDii wrote:

Это именно этот модуль. Но на тех скриншотах я не вижу ссылки Импорт. Smile

"А она там есть"(С) Smile
На четвертом скриншоте.

Аватар пользователя DivaDii DivaDii 13 декабря 2016 в 11:36

Ага. Аж теперь увидела.
Насколько я понимаю, это скрины давнишние. Возможно, еще с 6-го Друпала.

У меня Добавление терминов выглядит вот так:

TaxonomyManager

И в это поле просто копипастом вставляю стопку терминов.

У меня на этом сайте реально БОЛЬШАЯ таксономия. Один словарь "плоский", без иерархии. А во втором - глубокая иерархия.
Поэтому этот модуль помогает еще и управляться с иерархией.
И на этом сайте я без этого модуля - как без рук.

А на всех других своих дру-сайтах у меня этого модуля нету. Там он не нужен. Потому что в других местах нет такой навороченной таксономии и постоянного импорта.

Аватар пользователя vgo vgo 13 декабря 2016 в 13:39

Ага, это постоянно приходится учитывать, когда ищешь в инете что-то.
Если бы у меня была задача просто сделать систему, ввод лапами, возможно, был бы оптимальным, тем более, что моя утилита может так и сяк преобразовать csv файл.

Задача у меня сейчас другая - разобраться с технологиями друпала. Не импортировать словарь (два, три...) а научиться импортировать. В том числе и разобраться с интереснейшим модулем tamper (и, тем более, tamper php). С тем, чтобы стать подобным юному пионеру, который всегда готов. ))