利用SSIS之派生列导入不规则之文本数据

前端之家收集整理的这篇文章主要介绍了利用SSIS之派生列导入不规则之文本数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

问题@H_502_72@:

@H_502_72@

文本文件作为数据源,@H_502_72@
模式选择的右端未对齐,行分隔符是回车换行,@H_502_72@
列数有很多,但是最后两列在原始导入@H_502_72@TXT时由于是字符型的,且可以为空,@H_502_72@
所以最后两列可能同时为空,@H_502_72@
导致这样的行和别的行的宽度要少这两个列的列宽和;@H_502_72@
图片显示@H_502_72@2841-2844列是倒数第二行,@H_502_72@
2845-2853是倒数第一行,@H_502_72@
第一行为完整的@H_502_72@2853列,@H_502_72@
第四行数据实际为@H_502_72@2841列,@H_502_72@
在不做任何处理直接导入@H_502_72@(txt作为源@H_502_72@,sql作为目的@H_502_72@)@H_502_72@
导入的时候前三行没有问题,@H_502_72@
但导入类似第@H_502_72@4行到第@H_502_72@11行会报错。

@H_502_72@

@H_502_72@

说明@H_502_72@:

@H_502_72@

对于这样的问题,我的建议是

像下面这样的@H_502_72@4列数据@H_502_72@
aaa|bbb|ccc|ddd
aaa|bbb|ccc|
aaa|||
尽管后面两行列不完整,在插入文本数据时,还是要把分融符带上的

@H_502_72@

@H_502_72@SSIS中还有很多其它方法实现的,比如用脚本转换(只是遗憾@H_502_72@SSIS好像只支持@H_502_72@VB.NET写脚本,我只装了@H_502_72@C#:!@H_502_72@.

则我用派生列来解决@H_502_72@.

@H_502_72@

测试准备@H_502_72@:

@H_502_72@

建立一文本文件@H_502_72@ test.txt,内容如下,存放于@H_502_72@e:/tmp (本意为有两列,第二行中,数据不规范,分列符没有记录@H_502_72@)

@H_502_72@aaa|bbb

@H_502_72@aaa

@H_502_72@

打开@H_502_72@sql2005,

@H_502_72@

@H_502_72@USE test

@H_502_72@GO

@H_502_72@CREATE TABLE tb(f1 NVARCHAR(100),f2 NVARCHAR(100))

@H_502_72@GO

这步本来可以一起放@H_502_72@SSIS里做 ,这里就当作准备工作了。

@H_502_72@

利用@H_502_72@SSIS进行工作@H_502_72@

@H_502_72@

@H_502_72@ 1,打开@H_502_72@vs.net2005,新建项目@H_502_72@,c#>>商业智能项目@H_502_72@>>Integration Services 项目

@H_502_72@

@H_502_72@ 2,控制流里拖一个数据流任务

@H_502_72@

@H_502_72@ 3,双击数据流任务编辑@H_502_72@,进入数据流界面

@H_502_72@

@H_502_72@

@H_502_72@

@H_502_72@ 4,拖一平版文件源到界面,双击进入编辑,建一个平版文件连接指向@H_502_72@ e:/tmp/test.txt

@H_502_72@ 行分隔符默认@H_502_72@,列分隔符不选择,则默认认为一行中只有一个列,输出列命名为@H_502_72@col

@H_502_72@

@H_502_72@ 5,拖一派生列到数据流界面,并将平版文件指向它@H_502_72@.双击派生列,进入编辑

@H_502_72@ 因为我们预设的@H_502_72@txt文件中含两列,所以这里建两个派生列

@H_502_72@ 列名为 @H_502_72@F1,作为新列添加@H_502_72@,类型为@H_502_72@unicode string表达式为

@H_502_72@LEN(col) - LEN(REPLACE(col,"|","")) == 0 ? col : SUBSTRING(col,1,FINDSTRING(col,1) - 1)

@H_502_72@

列名为@H_502_72@ f2,作为新列添加,类型为@H_502_72@unicode string表达式为

@H_502_72@LEN(col) - LEN(REPLACE(col,"")) >= 1 ? SUBSTRING(col,1) + 1,1000) : ""


@H_502_72@

@H_502_72@

@H_502_72@

@H_502_72@6,拖一@H_502_72@OLEDB目标到数据流界面,指向@H_502_72@test库的@H_502_72@tb表,映射关系为

@H_502_72@F1 ->f1

@H_502_72@F2 ->2

@H_502_72@

后执行包,再到@H_502_72@sqlserver@H_502_72@:

@H_502_72@SELECT * FROM tb

@H_502_72@/*

@H_502_72@f 1 f 2

@H_502_72@aaa bbb

@H_502_72@aaa

@H_502_72@*/

@H_502_72@

@H_502_72@

其它方法我晚上回去装了@H_502_72@VB.Net再试下。

接触@H_502_72@SSIS几天了解不多,有好的方法,请不吝赐教

@H_502_72@ fcuandy

@H_502_72@2009.1

猜你在找的VB相关文章