利用SSIS之派生列导入不规则之文本数据
fcuandy
2009.1
问题:文本文件作为数据源, 
模式选择的右端未对齐,行分隔符是回车换行, 
列数有很多,但是最后两列在原始导入TXT时由于是字符型的,且可以为空, 
所以最后两列可能同时为空, 
导致这样的行和别的行的宽度要少这两个列的列宽和; 
图片显示:2841-2844列是倒数第二行, 
2845-2853是倒数第一行, 
第一行为完整的2853列, 
第四行数据实际为2841列, 
在不做任何处理直接导入(txt作为源,sql作为目的), 
导入的时候前三行没有问题, 
但导入类似第4行到第11行会报错。
说明:对于这样的问题,我的建议是
像下面这样的4列数据 
aaa|bbb|ccc|ddd 
aaa|bbb|ccc| 
aaa||| 
尽管后面两行列不完整,在插入文本数据时,还是要把分融符带上的SSIS中还有很多其它方法实现的,比如用脚本转换(只是遗憾SSIS好像只支持VB.NET写脚本,我只装了C#:!).
则我用派生列来解决.测试准备:建立一文本文件 test.txt,内容如下,存放于e:\tmp (本意为有两列,第二行中,数据不规范,分列符没有记录)
aaa|bbb
aaa打开sql2005,USE test
GO
CREATE TABLE tb(f1 NVARCHAR(100),f2 NVARCHAR(100))
GO
这步本来可以一起放SSIS里做 ,这里就当作准备工作了。利用SSIS进行工作 1,打开vs.net2005,新建项目,c#>>商业智能项目>>Integration Services 项目 2,控制流里拖一个数据流任务 3,双击数据流任务编辑,进入数据流界面 4,拖一平版文件源到界面,双击进入编辑,建一个平版文件连接指向 e:\tmp\test.txt
行分隔符默认,列分隔符不选择,则默认认为一行中只有一个列,输出列命名为col 5,拖一派生列到数据流界面,并将平版文件指向它.双击派生列,进入编辑
因为我们预设的txt文件中含两列,所以这里建两个派生列
列名为 F1 ,作为新列添加, 类型为unicode string表达式为
LEN(col) - LEN(REPLACE(col,"|","")) == 0 ? col : SUBSTRING(col,1,FINDSTRING(col,"|",1) - 1)列名为 f2,作为新列添加,类型为unicode string表达式为
LEN(col) - LEN(REPLACE(col,"|","")) >= 1 ? SUBSTRING(col,FINDSTRING(col,"|",1) + 1,1000) : ""6,拖一OLEDB目标到数据流界面,指向test库的tb表,映射关系为
F1 ->f1
F2 ->2最后执行包,再到Sqlserver下:
SELECT * FROM tb
/*
f1  f2 
aaa bbb
aaa
*/
其它方法我晚上回去装了VB.Net再试下。
接触SSIS几天了解不多,有好的方法,请不吝赐教

解决方案 »

  1.   

    我还是喜欢用程序来实现,毕竟SSIS的操作范围太小.
      

  2.   

    可以考虑倒入到一列中,在SQL中处理成另一个表,这样好理解些,写表达式总觉得不好理解
      

  3.   

    如果简单的处理单个文件的话,当然直接先导到库里再拆分好一些。但对一个比较复杂的要求,一个庞大的dts包里,如果有不规则数据(即不规则数据的处理只是其中流程的一部分),还是要在它里面解决了。