SSIS - 固定宽度的平面文件映射工具/技术

我想知道是否有一种工具(或特殊技术)可以用来在SSIS平面文件连接管理器中映射固定宽度的平面文件? 通常,我只需使用平面文件连接管理器编辑器(高级选项卡),然后逐个添加列信息(名称、宽度、数据类型等)。 这在过去对我来说效果很好,但现在我需要映射一个近500列的固定宽度文件... 我在想(希望)是否有一种工具或技术可以让我以更简洁的方式完成映射... 使用我提供的数据字典,我可以轻松地创建一个包含所需信息(列名、分隔符、输入列宽度、输出列宽度、数据类型)的Excel(或文本)文档,以便映射该文件。 我想知道是否有一种SSIS工具或组件可以读取此文件,并自动为我创建Flat File Connection Manager中的映射... 如果没有这样的工具,是否有人有任何技巧或提示,可以帮助我以最高效的方式进行文件映射? 我在想,也许我可以以某种方式修改SSIS包的XML文件,通过编写一些代码来将所有列的信息以XML格式脚本化,然后手动复制粘贴到包的XML文件中...不确定这是否可行... 注意:在SSIS中映射文件后,它将被加载到SQL Server表中。

Flat File Connection Manager Editor


你知道这些列的定义吗?还是它们是未知的或者可能会改变的? - Dave
@Dave 我知道列的定义是什么,它们不应该改变。 - Juan Velez
1我认为这将基本上给你想要做的东西。https://stackoverflow.com/questions/19260549/how-to-manage-giant-fixed-width-file-in-ssis/19261634#19261634 - mskinner
@mskinner 我觉得这可能会起作用。现在试一下。稍后再来看看。谢谢! - Juan Velez
1个回答

两个选项浮现在脑海中,都是无法说够好话的这个免费工具BIDS助手的特性。

创建固定宽度列

第一个是创建固定宽度列功能。它非常简单,只需创建一个指向正确文件的平面文件管理器并定义一个列。

完成这些后,您可以右键单击连接管理器,使用上下文敏感的"创建固定宽度列..."功能。

enter image description here

在下一个窗口中,您将Excel中的制表符分隔列表粘贴到编辑器中。

enter image description here

哦,是的,这很简单。如果你需要对列类型进行一些微调之类的操作,那么你就像平常编辑一样去修改它。 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的评论。

2我通常尝试使用相应的Biml回答SSIS问题,所以请随意查看我在SO上的回答,以了解关于“如何执行X”的示例。 - billinkc