两个选项浮现在脑海中,都是无法说够好话的这个免费工具BIDS助手的特性。
第一个是创建固定宽度列功能。它非常简单,只需创建一个指向正确文件的平面文件管理器并定义一个列。
完成这些后,您可以右键单击连接管理器,使用上下文敏感的"创建固定宽度列..."功能。
在下一个窗口中,您将Excel中的制表符分隔列表粘贴到编辑器中。 哦,是的,这很简单。如果你需要对列类型进行一些微调之类的操作,那么你就像平常编辑一样去修改它。 Biml 我喜欢用业务智能标记语言(Business Intelligence Markup Language)进行我的SSIS开发。它有很多好处,但在最基本的层面上,可以用它来处理糟糕透顶的扁平文件,尤其是当它们没有提供标题行时(我在看着你,大型机)。 在处理传统系统时,我经常遇到他们使用COBOL副本书定义文件。那些开发人员会给我发送带有列布局的Excel文件,比如:DATABASE FIELD NAME START LOC LENGTH
SEND.DT 1 STRING(08)
SEND.TIME 9 STRING(08)
DT 17 STRING(08)
TERM 25 STRING(04)
%ZONE 29 STRING(01)
这不是什么高级的东西,但是Excel公式轻松搞定了。所以我会根据上述内容创建4个新列。
清理后的名称(删除了列名中的无效字符)
=SUBSTITUTE(SUBSTITUTE(B3, ".", "_"), "%", "PCT_")
长度(提取了数字,注意这仍然有一个前导0,但不会影响)
=MID(E3,LEN("STRING(")+1,LEN(E3)-LEN("STRING(")-1)
XML(这将构建出用于平面文件定义的实际XML)
=CONCATENATE("<Column Name=""",F3,""" Length=""",G3,""" DataType=""AnsiString"" ColumnType=""FixedWidth"" CodePage=""1252"" />")
DDL(趁我在这里的时候,不妨顺便建立目标表)
=CONCATENATE(", ", F3, " varchar(", G3, ")")
DDL的第一列去掉了前导逗号,并用CREATE TABLE dbo.FOO()包裹起来。
最终,该XML会被放入一个FlatFileFormat标签中,然后只需简单地创建Connections集合和最后的包。看起来很多,但实际上非常简单,一旦你有了一个模式。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<FileFormats>
<FlatFileFormat
Name="FFF Pickup"
CodePage="1252"
RowDelimiter="CRLF"
IsUnicode="false"
FlatFileType="RaggedRight">
<Columns>
<Column Name="SEND_DT" Length="08" DataType="AnsiString" ColumnType="FixedWidth" CodePage="1252" />
<Column Name="SEND_TIME" Length="08" DataType="AnsiString" ColumnType="FixedWidth" CodePage="1252" />
<Column Name="DT" Length="08" DataType="AnsiString" ColumnType="FixedWidth" CodePage="1252" />
<Column Name="TERM" Length="04" DataType="AnsiString" ColumnType="FixedWidth" CodePage="1252" />
<!--
ad nauseum
-->
<Column Name="RPRTD_PU_PCS" Length="5" DataType="AnsiString" ColumnType="FixedWidth" CodePage="1252" />
</Columns>
</FlatFileFormat>
</FileFormats>
<Connections>
<FlatFileConnection
Name="FF Pickup"
FileFormat="FFF Pickup"
FilePath="C:\ssisdata\Operations\Input\Pickup Report Pickups.txt"
CreateInProject="false"
/>
</Connections>
<Packages>
<Package Name="PickupLoad" ConstraintMode="Linear" ProtectionLevel="DontSaveSensitive">
<Tasks>
<Dataflow Name="DFT Load Pickups" >
<Transformations>
<FlatFileSource
Name="OLE_SRC Pickup"
ConnectionName="FF Pickup"
RetainNulls="true">
</FlatFileSource>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
哦,还有一个类似的问题来自SO,答案也是非常相似。真希望在重写这个答案之前我看过Skinner的评论。