SSIS2012——格式不一致输出到平面源文件,然后数据流中ScriptComponent以Transformation方式解析格式不一致文件再导入数据到数据库中。

浏览: 1865

内容介绍

其实读文章标题就能明白这是一个互逆的操作。

一.把格式不一致的数据输出到平面文件。

二.再解析格式不一致文件,把数据导入数据库中的过程。

 1.格式不一致数据输出到平面源文件实现步骤

要实现输出到txt文件成如下格式。(很明显前两行跟后面内容格式不一致)

Clipboard Image.png

这里还是以AdventrueWorkDB示例数据库中的Sale.store表数据为例,选取500行。

a.在控制流中选取两个数据流任务,一个HEADER,另一个CONTENT,如图

Clipboard Image.png

b.在开头部分数据流中,拖入OLEDB源,命名为OLEDB_HEADER,配置如下

--访问模式我选择的是SQL命令,也可以封装成存储过程,通过 Exce来执行,方式很多,根据实际情况选择最方便高效的方法。
select 'CreateTime:'+convert(varchar(10),getdate(),120) as header
union all
select 'Creater:Zzjob'

得到开头部分

Clipboard Image.png

Clipboard Image.png

c.拖一个平面文件目标命名为“FFS_HEADER”配置如下,新建平面文件目标连接管理器

Clipboard Image.png

Clipboard Image.png

d.在DFT_CONTENT控制流中配置剩余格式一致内容部分,再新建一个平面连接源管理器FFS_CONTENT,还是指定之前的文件名

Clipboard Image.png

Clipboard Image.png

关键平面文件目标‘覆盖文件中的数据’不勾选,则会在原始文件换行追加。

Clipboard Image.png

点击相关映射,确定配置完成即可。执行结果,得到格式不定的test1

Clipboard Image.pngClipboard Image.pngClipboard Image.png

Clipboard Image.png

---------------------------------------------------------萌蠢分隔线---------------------------------------------------------------------------

2.解析得到的test1文件,把相关数据导入数据库。

先上数据流的全图

Clipboard Image.png

a.平面源文件的配置略过,连接管理器连接之前的test1文本就行了,但是有一点注意:把所有的列当作一列,我取列名为test。如图

Clipboard Image.png

b.脚本组件的配置。输入列配置中勾上,使用类型因为是读数据,选择ReadOnly就行了.

Clipboard Image.png

这里详细介绍下输入和输出的配置

看"输入0"下的子节点,从平面源文件读取过来的test列,是平面源输入的,应该好理解。

"Content"这是我改了名字,默认是“输出0"。 因为选的ScriptComponent组件Transformation-转换类型,所以肯定要有输出内容才行。

这里可以添加多个输出,这里我只添加了一个输出Content,根据实际需求来。根据test1文本内容添加了七列输出列。数据类型都是Unicode 字符串。

Transformation类型不需要配置连接管理器,作为Destination,或Source时配置。

Clipboard Image.png

c.在脚本选项,点击编辑脚本。

Clipboard Image.png

这里自动生成了三个方法:

PreExecute():数据流执行前调用

PostExecute():数据流执行完后调用

输入0_ProcessInputRow(输入0Buffer Row):数据流中一行行读取的时候调用。(以后再示例介绍下这个三个方法的调用情况)

这里只需要在0_ProcessInputRow(输入0Buffer Row)方法中写c#代码

       if (Row.test.StartsWith("CreateTime"))
{
Row.Createtime = Row.test.Substring(11, 10); \\取开头第一行时间
}
else if (Row.test.StartsWith("Creater")) \\取开头第二行人名
{
Row.Creater = Row.test.Substring(8, 5);
}
else \\取内容部分
{

string [] str = Row.test.Split(',');\\c#分割函数,以逗号分隔成数组返回。
Row.BusinessEntityID = str[0].ToString();
Row.Name = str[1].ToString();
Row.SalesPersonID = str[2].ToString();
Row.rowguid = str[3].ToString();
Row.ModifiedDate = str[4].ToString();
}

Clipboard Image.png

e.OLEDB目标的配置就不介绍了,上图标明下映射关系。

Clipboard Image.png

执行结果:内容500行+开头2行,执行没有问题。在看看数据库,数据成功导入。

Clipboard Image.pngClipboard Image.png

总结:1.这里是把ScriptComponent当作Transformation转换控件用的,不用配置连接管理器。

          2.开头部分在数据库单独行,单独列存储的。可能看着不舒服。但数据进入数据库了,简单的sql就可以解决了,或者在ScriptComponent中再增加一个输出项,输出到另外一张表中。

          3.ScriptComponent还有Destination和Source两种类型也可以解析这样的文件。配置上是有差别的,也是相当灵活。我用的最多的还是Transformation。以后再介绍下另外的两种方式。

推荐 0
本文由 粽子job 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册