加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 23:35:56 所属栏目:大数据 来源:网络整理
导读:问题 : 文本文件作为数据源, 模式选择的右端未对齐,行分隔符是回车换行, 列数有很多,但是最后两列在原始导入 TXT 时由于是字符型的,且可以为空, 所以最后两列可能同时为空, 导致这样的行和别的行的宽度要少这两个列的列宽和; 图片显示: 2841-2844

问题:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读