微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

问题:

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

原文地址:https://www.jb51.cc/vb/263336.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐