问题:
文本文件作为数据源,
模式选择的右端未对齐,行分隔符是回车换行,
列数有很多,但是最后两列在原始导入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
SELECT * FROM tb
/*
f
aaa bbb
aaa
*/
其它方法我晚上回去装了VB.Net再试下。
接触SSIS几天了解不多,有好的方法,请不吝赐教
fcuandy
2009.1