【问题标题】:SSIS import a Flat File to SQL with the first row as header and last row as a totalSSIS 将平面文件导入 SQL,第一行作为标题,最后一行作为总计
【发布时间】:2017-10-13 20:24:24
【问题描述】:

我收到了必须导入 SQL 表的文本文件,我必须附带一个 SSIS,因为我每天都会收到平面文件,第一行是 Customer_ID,然后是发票详细信息,然后是发票总额。

示例:

30303

0000109291700080190432737000005产品名称

0000210291700080190432737000010产品名称

0000309291700080190432737000000产品名称

003 000145

让我解释一下:

第一个 30303 是客户#

其他行发票详情

00001-> ROWID 092917-> DATE 000801904327->PROD 370->Trans 00010 -> AMOUNT
产品名称

最后一行

003==>总行 000145==>总发票

有什么线索吗?

【问题讨论】:

    标签: sql ssis sql-insert ssis-2012


    【解决方案1】:

    我会使用脚本组件作为数据流任务中的源。然后,您可以使用 C# 或 VB.net 以任何您希望的方式读取文件,例如,通过使用 System.IO.StreamReader。您可以一次读取一行,将值存储在变量中以写入每一行(例如,客户编号)等。对于复杂文件来说非常灵活。

    这是一个基于您的数据的示例脚本 (C#):

    public override void CreateNewOutputRows()
    {
        System.IO.StreamReader reader = null;
    
        try
        {
            bool line1Read = false;
            int customerNumber = 0;
    
            reader = new System.IO.StreamReader(Variables.FilePath); // this refers to a package variable that contains the file path
    
            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();
    
                if (!line1Read)
                {
                    customerNumber = Convert.ToInt32(line);
                    line1Read = true;
                }
                else if (!reader.EndOfStream)
                {
                    Output0Buffer.AddRow();
    
                    Output0Buffer.CustomerNumber = customerNumber;
                    Output0Buffer.RowID = Convert.ToInt32(line.Substring(0, 5));
                    Output0Buffer.Date = DateTime.ParseExact(line.Substring(5, 6), "MMddyy", System.Globalization.CultureInfo.CurrentCulture);
                    Output0Buffer.Prod = line.Substring(11, 12);
                    Output0Buffer.Trans = Convert.ToInt32(line.Substring(23, 3));
                    Output0Buffer.Amount = Convert.ToInt32(line.Substring(26, 5));
                    Output0Buffer.ProductName = line.Substring(31);
                }
            }
        }
        catch
        {
            if (reader != null)
            {
                reader.Close();
                reader.Dispose();
            }
    
            throw;
        }
    }
    

    Script Component的'Output 0'中的列配置如下:

    Name             DataType                           Length
    ====             ========                           ======
    CustomerNumber   four-byte signed integer [DT_I4]
    RowID            four-byte signed integer [DT_I4]
    Date             database date [DT_DBDATE]
    Prod             string [DT_STR]                        12
    Trans            four-byte signed integer [DT_I4]
    Amount           four-byte signed integer [DT_I4]
    ProductName      string [DT_STR]                       255
    

    要实现这个:

    • 创建一个名为“FilePath”的字符串变量,其中包含您的文件路径以供脚本引用。
    • 创建数据流任务。
    • 将脚本组件添加到数据流任务 - 系统会询问您它应该是什么类型,选择“源”。
    • 右键单击脚本组件,单击“编辑”。
    • 在“脚本”窗格中,将“FilePath”变量添加到“ReadOnlyVariables”部分。
    • 在“输入和输出”窗格中,展开“输出 0”并按照上表将列添加到“输出列”部分。
    • 在“脚本”窗格中,单击“编辑脚本”,然后将我的代码粘贴到 public override void CreateNewOutputRows() 方法上(替换它)。
    • 您的脚本组件源现已配置完毕,您可以像使用任何其他数据源组件一样使用它。要将此数据写入 SQL Server 表,请将 OLEDB 目标添加到数据流任务,并将脚本组件链接到该目标,适当配置列。

    【讨论】:

    • 任何提示..你有一个例子吗?
    • 我已经用示例脚本更新了我的答案,如果您需要任何说明,请告诉我。
    • 一个问题是关于如何在 SSIS 中组装所有内容,例如移动数据流任务然后移动这个,以及如何将结果复制到输出 sql 表中。谢谢
    • 非常感谢克里斯 :) 我会试试的,让你知道.. 谢谢
    • 我在复制最后一行或页脚时遇到问题。 003==>总行数 000145==>总发票
    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多