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

Jua*_*lez 7 sql-server ssis

我想知道是否有任何人用来在 SSIS 平面文件连接管理器中映射固定宽度平面文件的工具(或特殊技术)?

通常我只使用平面文件连接管理器编辑器(高级选项卡)并开始为所有列 1 x 1 添加列信息(名称、宽度、数据类型等)。

这在过去对我来说很好用,但现在我必须映射一个接近 500 列的固定宽度文件......

我在想(希望)应该有一种我可以使用的工具或技术,让我能够以更流畅的方式完成映射......

使用我为文件提供的数据字典,我可以轻松创建一个 excel(或文本)文档,例如包含一些列,其中包含 SSIS 需要的必要信息(列名、分隔符、InputColumnWidth、OutpuColumnWidth、DataType)来映射文件.

我想知道是否有一个 SSIS 工具或组件可以读取此文件并自动为我在平面文件连接管理器中创建映射...

如果没有这样的工具,有没有人有任何技巧或提示可以帮助我以最有效的方式映射文件?

我想知道我是否可以修改 SSIS 包 xml 文件的方式,我可以创建一些代码来编写 xml 格式的所有列的列信息,然后我可以手动将其复制并粘贴到包 xml 中文件...不确定这是否有效....

注意:在 SSIS 中映射文件后,它将被加载到 SQL Server 表中

平面文件连接管理器编辑器

bil*_*nkc 11

我想到了两个选项,这两个选项都是关于这个免费工具BIDS Helper 的功能

创建固定宽度的列

第一个是创建固定宽度列功能。它就像创建一个指向正确文件的平面文件管理器并定义 1 列一样简单。

完成后,右键单击连接管理器并使用“创建固定宽度列...”的上下文相关功能。

在此处输入图片说明

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

在此处输入图片说明

哦,是的,就是这么简单。如果您需要对列类型等进行一些调整,那么您可以像往常一样使用编辑进行更改。

比尔

我喜欢用于 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)
Run Code Online (Sandbox Code Playgroud)

它并不花哨,但 Excel 公式使它的工作时间很短。所以我会根据上述内容创建 4 个新列。

清理名称(删除了列名称的无效字符)

=SUBSTITUTE(SUBSTITUTE(B3, ".", "_"), "%", "PCT_")
Run Code Online (Sandbox Code Playgroud)

长度(提取数字,注意这仍然有一个前导 0 但它不会伤害)

=MID(E3,LEN("STRING(")+1,LEN(E3)-LEN("STRING(")-1)
Run Code Online (Sandbox Code Playgroud)

XML(这为平面文件定义构建了实际的 XML)

=CONCATENATE("<Column Name=""",F3,""" Length=""",G3,"""  DataType=""AnsiString""  ColumnType=""FixedWidth""  CodePage=""1252"" />")
Run Code Online (Sandbox Code Playgroud)

DDL(当我在的时候也可以构建目标表)

=CONCATENATE(",   ", F3, " varchar(", G3, ")")
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

哦,还有来自SO的类似问题,但答案却令人不安。希望我在重写这个答案之前看过斯金纳的评论。

  • 我通常会尝试使用相应的 biml 来回答 SSIS 问题,因此请随时查看我在 SO 上的答案,以查看“我如何做 X”的示例 (2认同)