欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何使用Feeds模块导入CSV文件 自己亲自做的 并不完美 有大用 有大大用

shiping1 的头像

结合 http://shipingzhong.cn/node/5385 看看如何使用 
如何使用Feeds模块导入CSV文件

 

Feeds模块的灵活使用会起到事半功倍的作用,特别是当需要输入大量有规律的数据时,是否能正确使用Feeds模块直接决定你的生产力!由于Drupal的数据库结构比较复杂,很多情况下一个实体的字段不像其他系统,分散在多个数据库表,单纯的直接通过数据库导入某个实体的数据是不大可能的。本文介绍如何通过Feeds的界面和Feeds模块提供的API实现批量导入某个分类下的词汇。

 

【场景】

例如我们需要实现以下内容

居委会(用于物流)------------ 分类名

   某区名A       ------------ 术语名  

     居委会A     ------------ 子术语名 (同时这个子术语具有以下字段)

     (居委会的自定义字段:详细地址,电话,联系人)

 

步骤1:如图创建分类名称

tu_pian_1.png

步骤2:如图创建自定义字段

tu_pian_2.png

 

 

这样我们就创建了我们需要导入的分类和其所属的术语实体结构。

 

【Feeds的导入功能】

如果我们现在有几百个居委会的联系方式,按照Drupal的术语创建界面一一输入的话,估计要花费一些时间才能完成,这个时候就需要利用feeds模块的导入功能创建我们自己自定义的模块来实现,当你看完这篇文章后,你基本上就可以在10分钟之内完成Drupal程序芳年的准备工作了。(准备CSV数据不算在内)

步骤3:Feed界面的相关准备工作

通过地址栏admin/structure/feeds如图打开Feeds的设置界面。单击【Add importer】

tu_pian_3.png

步骤4:通过前一个步骤我们假设创建了一个名称为【import community】的Feeds。如图进入它的配置界面。

在左侧第一个的基本设置中我们需要对它进行本次实现场景的必要设置。图中红色标识是要点。

tu_pian_4.jpg

 

步骤5:feeds-提取器的设置。

由于我们是通过上传CSV文件实现导入的功能,如图进行设置

tu_pian_5.png

步骤6:feeds-文件上传的设置。如图,标识为要点。

tu_pian_6.png

 

步骤7:feeds-解析器的设置

由于我们要上传的文件是CSV格式的,其解析器如图进行设置。

tu_pian_7.png

 

步骤8:feeds-CSV parser定界符

如果CSV文件中每个字段的值是以逗号分隔,如图进行设置。

tu_pian_8.png

步骤9:feeds-Processor的设置

这里是选择我们导入的CSV是Drupal中我们定义的哪个实体,feeds默认提供了这三种。

很显然我们要选择Taxonomy term processor。

tu_pian_9.png

 

步骤10:feeds-Taxonomy term processor的设置

根据前一步骤的设置,对Taxonomy term processor进行必要设置。

如图,词汇表中下拉框选择我们目标导入的分类名。

其他设置如图所示即可,其中更新已有的分类可根据你的需要进行选择。

tu_pian_11.png

步骤11:feeds-CSV的映射

这一步是最重要的设置。我们要针对CSV中的字段值和Drupal中的目标术语进行关联。

图中A区域是CSV中的字段名,B区域就是drupal中术语中的字段名。

tu_pian_12.png

 

下图为准备的CSV数据示范。我们通过输入CSV字段的名称和C区域的选项来配置他们的映射关系。

tu_pian_13.png

 

箭头所指行为CSV中的字段名称,这一行被称为head。

其他的行均为对应的值。(示例中第二行为0的相当于区的名称,其仅有名称而已)

CSV中                术语中

Area   ----------------》  父术语名

Index  ----------------》   权重(即术语中的上下顺序)

Name  ----------------》  术语名(本例为居委会名)

Address ----------------》  地址字段

Tel    ----------------》  联系电话字段

Contact ----------------》  联系人字段

 

步骤11:生成feeds的代码

如图所示复制所有生成的代码,我们需要利用Feeds的API创建一个自定义模块。

tu_pian_14.png

 

 

步骤12:撰写模块

自定义模块的流程,请参考Drupal官方的规定。

即创建模块名称的文件夹到/sites.all/module/下,并创建info和module文件。

假设我们的模块名为custom,其路径为sites/all/module/custom,文件为custom.info和custom.module.

下面主要描述custom.module.的写法。

需要用到2个hook,

hook_feeds_importer_default()和hook_ctools_plugin_api()。

代码如下,图中$export['import_community'] = $feeds_importer;中的import_community需要替换成你自己的feed id。他的值可以生成代码的第4行$feeds_importer->id = 'XXXXXXXX';中可确认到。

 

function custom_feeds_importer_default() {

   //此处粘贴生成的代码

   ...........................

   ..........................

   

   //在上图代码之外添加以下两行

   $export['import_community'] = $feeds_importer;

   return $export;

}

 

function custom_ctools_plugin_api($owner, $api) {

   if ($owner == 'feeds' && $api == 'feeds_importer_default') {

     return array('version' => 1);

   }

}

 

自定义模块编写OK!就这么简单,让我们看看Feed后台的界面吧。(别忘了清除drupal的缓存)

如图我们自定义的feed名称已经生成,点击上图的import连接,开始执行导入。

tu_pian_15.png

 

步骤12:执行导入

如图单击我们自定义的Feed名称。

tu_pian_16.png

 

下图是选择导入文件的界面,图中还给出了根据我们的设置自动生成的CSV模板文件,此文件便于我们交给数据准备人员。其他的操作基本上很简单了,上传CSV文件执行导入!完工。

tu_pian_17.png

 

最终效果图

tu_pian_18.png

tu_pian_19.png


feeds 的基本功能就在下图image.png



当然,我们可以禁用导出功能,如下图 ,去掉勾 /admin/structure/feeds


image.png来自  http://drupalchina.cn/node/5366

 

Feeds 模組

2015-02-05 由 Hank Yang 發表
  googleplus   blogger      

今天要介紹的是模組是feeds:這是一個可以將資料匯入網站之中,讓使用者可以輕鬆的將大量資料匯入到Drupal網站中

1.請先安裝feeds跟feeds tamper

用Drush 安裝 drush en feeds feeds_tamper -y

2.點選架構>>feeds importers>>點選Add importer 新增設定檔

點選Add importer 後 會進入到設定頁面>>>如下圖

3.設定Feeds

請先點選Basic settings 的 設定

點選Fetcher 變更上傳格式

點選Phaser 確認parser格式為csv parser

接著點選Processor 進行設定,預設為Node Processor 這邊只需確認是Node Processor 即可

針對Node Processor 進行設定

針對Node Processor 匯入欄位,進行設定

請重新點選架構>>feeds importers>>tampar

針對image 欄位匯入設定進行覆寫

接著要設定的是,如何讓匯入的image可以上傳多張圖片,一樣點選add plugin

設定完成以後,會像這樣有兩個plugin

這樣就完成一個feeds 基本的上傳設定

接著要編輯上傳的csv 檔案,只要用excel檔案,輸入完成後,另存新檔格式為csv

注意image 欄位的圖檔是寫public://field/image/檔名之間用,間隔來區分圖檔,要匯入的圖檔記得要先放到sites/default/files/field/image/裡面這樣系統匯入才抓的到

接著進行Feeds匯入

將網站網址後面的加上import 假設我的網址是www.test.com.tw 就在後面加上 www.test.com.tw/import 進入匯入頁面

點選後進入匯入頁面

這是匯入完成的樣子

 

 

 

 

如何用 Feeds 匯入 Field Collection 的內容

請到:https://drupal.org/node/1063434 參考這個patch field_collection-feeds_integration.patch ,將這個patch 加入到/sites/all/module/field_collection/field_collection.module中

完成以後要先到module 中 確認 field collection這個模組有開啟,然後在Feeds 頁面的 Node Processor 的Target 就可以選擇 field collection 的欄位囉

如下圖所示:圖文整合 是我的field collection 欄位

 

 

 

順帶一提,如果你的field collection 是有多張圖片的話,tamper 中,針對該圖片欄位 加上explode 這個條件即可

 

 

標籤: 
羊炳翰 hank Yang 1992年生,興趣:看電影跟旅遊,專長是Drupal後台製作、撰寫網站前台CSS、responsive響應網站製作,目前在聖誕老人當小小工程師
 




来自 http://www.hellosanta.com.tw/Drupal%E7%B6%B2%E7%AB%99%E8%A8%AD%E8%A8%88/feeds-%E6%A8%A1%E7%B5%84


使用Feeds模块导入Excel数据

目的

把Excel文档(xls格式,不是csv格式)中的数据导入到Drupal中,并生成对应的内容类型(content type)的数据节点。网上关于导入csv数据的很多,这里就不介绍了。

我这里主要写以下几个方面:

  • 配置注意事项;

  • 遇到的问题和解决方案;

环境

Drupal 6

模块

Feeds 6.x-1.0-beta13, Feeds Excel 6.x-1.0

步骤

安装步骤和其它模块类似,这里就不写了。具体配置和关于Feeds使用的信息可以参考Drupal上的Feeds模块的文档页面:

配置说明

  1. Mapping/映射

Processor选择Node processor,进入Mapping配置就比较迷惑了,怎么把Excel表中的列映射到节点类型中的字段呢?如果你在源字段文本框中填写Excel中列的名字是不对的。对于Excel类型的文件源,应该使用Feeds Excel模块提供的类似token的字段名字。看下图,其中“Legend sources”是Feeds Excel模块提供的源字段Token,应该使用这里面提供的字段。

如果想把第一列映射为Node的Title,第二列映射为Body,那么映射关系为:

[column-1]    Title

[column-2]    Body

  1. Excel parser/Excel解析器

Parser选择Excel parser。如果一行数据对应一个node,Mapping mode应该选择Rows;Sheets是Excel文件中放有数据的Sheet;

Iterative range需注意,如果你的Excel文件第一行是表头/列字段,那么抽取数据应该从第二行开始,即2:10000,默认是1:10000;

碰到的问题和解决方法

  1. 没有映射的目标字段(对应的content type中的字段)

如果要映射的content type是通过编写模块定义的,那么目标字段就不在Mapping的Legend中。那怎么办呢?有两种办法:一种是自定义一个processor,可以继承FeedsNodeProcessor;另外一种简单的方法,使用Feeds提供的hook:hook_feeds_node_processor_targets_alter(&$targets, $content_type)

比如自己写个模块,实现这个hook。这样在Mapping中的tagarget field列表中就可以选择使用了。

/**
* Implementation of hook_feeds_node_processor_targets_alter().
*/
function mymodule_feeds_node_processor_targets_alter(&$targets, $content_type) {
  if ($content_type == 'item') {
    $targets['code'] = array(
      'name' => t('item code'),
      'description' => t('item code'),
      'callback' => '_mymodule_set_target',
      'optional_unique' => TRUE,
    );
    $targets['item_name'] = array(
      'name' => t('item name'),
      'description' => t('item name'),
      'callback' => '_mymodule_set_target',
    );
  }
}

function _mymodule_set_target(&$node, $target, $value) {
  if (is_array($value) || ( ($value == '')) {
    return;
  }

  $node->$target = $value;

}

  1. 重复数据导入

比如需要导入产品信息,每个产品的code/编码是唯一的,系统中不应该具有同一个code的两个节点。Feeds导入数据时区分是否唯一只能通过三个字段:node nid,url和GUID。对于Excel文件中的新数据,不可能有node nid数据,所以没办法通过提供node nid方式区别;另外也没有url数据;

这里解决的方法是使用GUID。配置上把Excel中code列映射为GUID,并选上Unique target。

这样在每次导入时,GUID数据会写入feeds_node_item数据表中,再次导入数据时,会查询这个表,如果发现同一个GUID/code已经存在,将不会导入。

另外一种情况使用这个方法也没办法避免;比如之前系统中通过手工方式录入了一个产品,后面又通过Feeds导入同一个产品,这时是可以导入的。因为通过手动录入的产品是不会向这个表中写GUID信息的。

  1. Excel中的中文数据

如果Excel文件不是用utf-8编码的,那么导入之后会出现乱码。解决办法在Feeds issue中有提供:ChineseCharacters

也可以参考Drupal中国上“feeds excel模块教程》,非常感谢作者的贡献。

Feeds和Feeds Tamper模块其它方面的问题和不足

  1. Feeds对重复数据导入控制支持不足;

  2. 对于导入Excel文件(包括CSV),支持Required field有问题

这一点说明下:如果某个字段是必填的(即Excel文件中该列的值不能为空),那么理论上是可以使用FeedsTamper模块的Required field plugin来控制的,但模块针对Excel类型实现有问题,目前并不支持。

用了Feeds短短几天,可能我说的并不全面和准确,欢迎指正和交流。


来自 http://blog.bestbole.com/drupal/import-excel-data-by-feeds-module



http://web-dev.wirt.us/info/drupal-7/importing-excel-xls-file-generate-nodes-or-terms-feeds


普通分类: