SSIS合并CSV文件

时间:2018-10-22 10:03:28

标签: ssis

我对所有SSIS东西都是新手。我坚持下去。我想合并多个CSV文件,然后将它们放入数据库中。这些文件都具有相同的信息。例子:

文件1

   Week         Text1
 22-10-2018      58
 29-10-2018      12

文件2

   Week         Text2
 22-10-2018      55
 29-10-2018      48

文件3

   Week         Text3
 22-10-2018      14
 29-10-2018      99

预期结果: 结果进入数据库

   Week         Text1    Text2    Text3
 22-10-2018      58        55       14
 29-10-2018      12        48       99

我通过选择文档,使用排序然后进行合并合并达到了这一目标。对于3个文档,这花了我3种和2种合并合并。我必须对大约86个文档执行此操作。必须有一种更简单的方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

我同意KeithL,建议您的决赛桌如下:

Week        Outcome    Value      DateModified
=======================================================
22-10-2018     AI       58       2018-10-23 20:49
29-10-2018     AI       32       2018-10-23 20:49
22-10-2018    Agile     51       2018-10-23 20:49
29-10-2018    Agile     22       2018-10-23 20:49

如果您想调整周或结果,请在报告工具中进行。

不要创建带有动态命名列的表-这是一个好主意

无论如何,这是一种使用登台表的方法。

创建一个临时表,将文件插入其中:

脚本1:

 CREATE TABLE Staging (
      [Week]         VARCHAR(50),
      Value          VARCHAR(50),
      DateModified   DATETIME2(0) DEFAULT(GETDATE())
     )

导入整个文件,包括标题。换句话说,在定义文件格式时,请勿勾选“第一行的列”

我们这样做有两个原因:

  1. SSIS无法使用相同的数据流导入具有不同标题名称的文件
  2. 我们需要在登台表中捕获标题名称

导入文件后,登台表如下所示:

Week          Value    DateModified   
=======================================
Week          Agile    2018-10-23 20:49    
22-10-2018      58     2018-10-23 20:49
29-10-2018      32     2018-10-23 20:49

现在选择要加载的形状的数据。在导入数据以检查后在数据库中运行此数据:

脚本2:

SELECT Week, Value,
(SELECT TOP 1 Value FROM Staging WHERE Week = 'Week') Outcome
FROM staging 
WHERE Week <> 'Week'

现在添加一个INSERT和一些逻辑来停止重复项。导入数据后,将其放入执行SQL任务

脚本3:

WITH SRC As (
SELECT Week, Value,
(SELECT TOP 1 Value FROM Staging WHERE Week = 'Week') Outcome
FROM staging As SRC
WHERE Week <> 'Week'
)

INSERT INTO FinalTable (Week,Value, Outcome)
select  Week, Value, Outcome
FROM SRC
WHERE NOT EXISTS (
    SELECT * FROM FinalTable TGT 
    WHERE TGT.Week = SRC.Week 
    AND TGT.Outcome = SRC.Outcome
    )

现在,您将其包装在每个文件循环中,对文件夹中的每个文件重复此操作。不要忘记导入每个文件之前需要TRUNCATE TABLE staging

摘要:

  1. 为每个文件迭代器设置一个
  2. 里面有:
    • 带有TRUNCATE TABLE Staging的SQL任务;
    • 用于将文本文件从迭代器导入到登台表的数据流
    • 其中包含脚本3的SQL任务

我将DateModified列放在表中,以帮助您进行故障排除。

  • 好东西:您可以一遍又一遍地运行它,然后重新导入同一文件,而不会得到重复
  • 坏的事情:将VARCHAR插入DATE或INT时可能发生强制转换失败

答案 1 :(得分:0)

您可以使用简单的C#脚本组件(源)读取文件。

您需要将3列添加到output0。

  1. 每周的DT_Date
  2. 输入为DT_STR
  3. 值为DT_I4

    string[] lines = System.IO.File.ReadAllLines([filename]);
    int ctr = 0;
    string type;
    
    foreach(string line in lines)
    {
       string[] col = line.Split(',');
       if(ctr==0) //First line is header
       {
          type = col[1];
       }
       else
       {
          Output0Buffer.AddRow();
          Output0Buffer.Week = DateTime.Parse(col[0]);
          Output0Buffer.Type = type;
          Output0Buffer.Value = int.Parse(col[1]);
       }
       ctr++;
    }
    

加载到表格后,您始终可以使用动态数据透视表创建视图。