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

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

问题:

 

文本文件作为数据源,
模式选择的右端未对齐,行分隔符是回车换行,
列数有很多,但是最后两列在原始导入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

/*

f 1   f 2

aaa   bbb

aaa  

*/

 

 

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

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

                                                                      fcuandy

                                                                      2009.1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值