SSIS将平面文件导入SQL,第一行作为标题,最后一行作为总计

时间:2017-10-13 20:24:24

标签: sql ssis sql-insert ssis-2012

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

示例:

30303

0000109291700080190432737000005产品名称

0000210291700080190432737000010产品名称

0000309291700080190432737000000产品名称

003 000145

让我解释一下:

首先是30303是客户#

其他行发票明细

00001-> ROWID 092917->日期000801904327-> PROD 370-> Trans 00010->金额
     产品名称

最后一行

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

任何线索?

1 个答案:

答案 0 :(得分: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;
    }
}

输出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目标添加到数据流任务,并将脚本组件链接到该组件,并相应地配置列。