首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSIS组合CSV文件

SSIS组合CSV文件
EN

Stack Overflow用户
提问于 2018-10-22 10:03:27
回答 2查看 458关注 0票数 0

我对SSIS有些陌生。我坚持住了。我想要组合多个CSV文件,然后将它们放入数据库中。所有的文件都有相同的信息。示例:

档案1

代码语言:javascript
复制
   Week         Text1
 22-10-2018      58
 29-10-2018      12

档案2

代码语言:javascript
复制
   Week         Text2
 22-10-2018      55
 29-10-2018      48

档案3

代码语言:javascript
复制
   Week         Text3
 22-10-2018      14
 29-10-2018      99

预期结果: DB的结果

代码语言:javascript
复制
   Week         Text1    Text2    Text3
 22-10-2018      58        55       14
 29-10-2018      12        48       99

通过选择文档、使用排序和连接合并,我取得了很大的成绩。对于3份文件,我花了3种和2种加入合并。我必须这样做大约86个文档。一定有更简单的办法。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-23 06:39:27

我同意KeithL的意见,我建议您的最后一张表如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 CREATE TABLE Staging (
      [Week]         VARCHAR(50),
      Value          VARCHAR(50),
      DateModified   DATETIME2(0) DEFAULT(GETDATE())
     )

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

我们这样做有两个原因:

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

导入文件后,暂存表如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
SELECT Week, Value,
(SELECT TOP 1 Value FROM Staging WHERE Week = 'Week') Outcome
FROM staging 
WHERE Week <> 'Week'

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

脚本3:

代码语言:javascript
复制
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
    )

现在,您可以将其封装在一个for每个文件循环中,该循环会对文件夹中的每个文件重复此操作。不要忘记,在导入每个文件之前,您需要进行TRUNCATE TABLE staging

摘要:

  1. 为每个文件迭代器设置一个
  2. 内部:
    • 带有TRUNCATE TABLE Staging的SQL;
    • 将文本文件从迭代器导入到暂存表的数据流。
    • 一个包含脚本3的SQL任务

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

  • 好事情:您可以一遍又一遍地运行它,并重新导入同一个文件,这样就不会得到重复的文件。
  • 坏事情:将VARCHAR插入日期或INT时可能发生转换失败
票数 1
EN

Stack Overflow用户

发布于 2018-10-22 13:58:33

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

您需要将3列添加到output0中。

  1. 作为DT_Date的周
  2. 类型为DT_STR
  3. 值为DT_I4 string[] line = System.IO.File.ReadAllLines(filename);int ctr = 0;string类型;foreach(string line in Line){ string[] col = line.Split(',');if(ctr==0) //第一行是头{ type = col1;}line.Split{ Output0Buffer.AddRow();Output0Buffer.Week =DateTime.Parse(Output0Buffer.AddRow);Output0Buffer.Type = type;Output0Buffer.Value = int.Parse(col1);} ctr++;}

加载到表后,始终可以创建具有动态枢轴的视图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52926761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档