2017-04-02 29 views
2

我有一个文件夹,其中包含许多具有相同格式(相同表结构但数据不同)的csv文件。我希望将这些csv文件中的所有数据作为SSIS包内的单个数据集。我目前的解决方案是这样的:在SQL Server中创建一个帮助表,并使用For Each Container将所有文件加载到表中。然后将该表作为SSIS包中所需的单个数据集加载。将多个csv文件作为单个数据集加载的最佳方式

但是,我非常喜欢一种不依赖于在SQL Server中创建这样的额外表的方法。我在想,使用C#和Script组件可能会有更好的方法。有人有任何建议吗?

回答

2

如何:

var allCsv = Directory.EnumerateFiles("Src-Path", ".*csv", SearchOption.TopDirectoryOnly); 
string[] header = { File.ReadLines(allCsv.First()).First(l => !string.IsNullOrWhiteSpace(l)) }; 
var mergedData = allCsv 
    .SelectMany(csv => File.ReadLines(csv) 
     .SkipWhile(l => string.IsNullOrWhiteSpace(l)).Skip(1)); // skip header of each file 
File.WriteAllLines("Dest-Path", header.Concat(mergedData)); 

只是注意,您必须使用System.Linq的补充;

+0

在最后一行中,我是否需要写mergeData值转换为csv文件? – TheEsnSiavashi

+1

取决于您是否要将其保存到合并的csv文件,或者只是通过代码使用它,并只保存需要的输出,但合并后的数据包含从头文件中删除标题的所有数据 –

+0

I不需要合并的csv文件,将数据输入为脚本组件的输出是我喜欢的,谢谢。 – TheEsnSiavashi

0

这应该为你做。

var allCsv = Directory.EnumerateFiles("Src-Path", ".*csv", SearchOption.TopDirectoryOnly); 
string[] header = { File.ReadLines(allCsv.First()).First(l => !string.IsNullOrWhiteSpace(l)) }; 
var mergedData = allCsv 
    .SelectMany(csv => File.ReadLines(csv) 
     .SkipWhile(l => string.IsNullOrWhiteSpace(l)).Skip(1)); // skip header of each file 
File.WriteAllLines("Dest-Path", header.Concat(mergedData)); 

http://www.sqldataplatform.com/Blog/Post/49/How-to-Combine-CSV-Files-Using-a-Simple-C--Script

注意,你甚至不需要C#的,因为这简单的东西!实际上,您可以使用命令提示符进行完全标准化的操作。

打开命令窗口。 (按下“视窗键”和“R”,然后键入命令并回车。

Type copy c:\*.csv c:\File.csv and press enter 

This will combine all of the csv files that are in your root c:\ directory into one file called File.csv. 

您可以根据需要更改文件名和路径。

相关问题