为什么在将数据从Excel传输到CSV时,SSIS将最后一行保存为NULL?
Excel中:
input文件包含如下所示的数据。
Column ------ 123456 234567 ADCDEF
CSV /文字:
输出文件包含如下所示的数据
Column ------ 123456 234567 NULL
为什么在将数据从Excel
传输到CSV
时,SSIS包在最后一行写入NULL值而不是ABCDEF ?
问题是,Excel文件包含数值和string的混合数据,这会导致Excel读取前几行并将数据types推断为数字,在这种情况下不是这样。 当您创buildExcel数据源来读取此Excel文件时,您会注意到该列被定义为数字并以此方式处理。 因此,string永远不会输出到输出文件。
您需要修改Excel连接pipe理器的ConnectionString属性以包含IMEX=1
以指示数据源可能包含不同数据types的值。
IMEX
代表intermixed
阅读更多关于它在这里: Excel的连接string
这里是一个例子来说明不同之处。
我根据问题中提供的数据创build了两个相同的Excel文件。
创build一个SSIS包与以下连接pipe理器。
Excel_1有以下连接string
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_1.xls;Extended Properties="Excel 8.0;HDR=YES";
Excel_2有以下连接string。 不同的是额外的IMEX = 1 ;. 您需要手动将其添加到Excel连接pipe理器的ConnectionString属性。 要查看属性,请单击Excel连接pipe理器 ,然后按F4键。
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\ExcelFile_2.xls;Extended Properties="EXCEL 8.0;IMEX=1;HDR=YES";
devise数据stream如下所示将Excel_1.xls
传输到FlatFile_1.csv
和Excel_2.xls
到FlatFile_2.csv
您可以在输出中看到第一个平面文件没有第三行的任何值,但是第二个文件没有。 原因是第一个Excel连接pipe理器推断列types是数字的,这是不正确的。 但是,第二个文件处理了
您可以右键单击Excel数据源并单击Show Advanced Editor...
在高级编辑器上,单击Input and Output Properties
,展开Excel源输出,然后展开External Columns
。 点击Column
。
您会注意到,第一个Excel数据源上的列的数据types在第一个Excel连接pipe理器Excel_1
上设置为double-precision float [DT_R8]
您将注意到第二个Excel数据源Excel_2
的数据types被设置为第一个Excel连接pipe理器Excel_2
上的Unicode string [DT_WSTR]
希望有所帮助。