Sql SSIS,从一个CSV文件导入多个数据集

Sql SSIS,从一个CSV文件导入多个数据集,sql,csv,ssis,Sql,Csv,Ssis,我得到了一组csv文件和两个数据集,它们都不是固定长度的。谁能建议我如何从文件中提取数据集,并将它们导入SQL中的单独表中 文件格式为 17行标题信息 “摘要”一词 第一节的列标题 第一节*多行 空行 “细节”一词 第二节的列标题 第二节*多行 已编辑 如果有人想做实验,我假设文件是这样的: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah

我得到了一组csv文件和两个数据集,它们都不是固定长度的。谁能建议我如何从文件中提取数据集,并将它们导入SQL中的单独表中

文件格式为

  • 17行标题信息
  • “摘要”一词
  • 第一节的列标题
  • 第一节*多行
  • 空行
  • “细节”一词
  • 第二节的列标题
  • 第二节*多行
已编辑

如果有人想做实验,我假设文件是这样的:

blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
blah 
SUMMARY
headers1
S1L1
S1L2
S1L3

DETAIL
headers2
S2L1
S2L2
S2L3

如果您可以使用
awk
,则此脚本将执行此操作:

awk 'BEGIN{out=""}/SUMMARY/{out="1.csv";next}/DETAIL/{out="2.csv";next}/^$/{out="";next} length(out){print > out}' file
在开始时,它将输出文件名设置为nothing。然后,如果它看到单词“SUMMARY”,它将输出文件名设置为“1.csv”。如果它看到单词“DETAIL”,则将输出文件名设置为“2.csv”。在其他行中,它检查输出文件是否已指定,如果已指定,则写入


您的两个部分将以“1.csv”和“2.csv”结尾。脚本完全不依赖于行数,只依赖于单词“摘要”和“详细信息”。

基于Marks的建议,我构建了这个脚本作为我的第一个剪切脚本任务。它需要添加摘要部分,但这很容易。(脚本化任务对象c#)


}

导入数据之前是否可以拆分为2个文件?现在可以,但我需要完全自动化该过程,然后我将无法手动拆分文件。如果SSIS中有一种方法可以将文件分开,我希望您不介意我的编辑来澄清。您可以使用脚本任务来完成这项工作,只要您确定结构是相同的,而不考虑每个部分的行数。我不使用awk。然而,这一点和上面的评论让我进入了c#script领域,有了这一点来指导我,似乎给了我一个可行的脚本!在第一个while循环中也是infie.EndOfStream-以防万一有一天你没有得到详细的部分。
    public void Main()
    {
        // TODO: Add your code here            
        System.IO.StreamWriter outfile = null;
        string line=null;
        string inputfile = Dts.Variables["SourceFiles"].Value.ToString();
        var infile = new System.IO.StreamReader(inputfile);
        string outpath = Dts.Variables["DetailFiles"].Value.ToString();
        int CounterPart = (int)Dts.Variables["CounterPart"].Value;
        outpath = string.Format(outpath, CounterPart++);
        outfile = new System.IO.StreamWriter(outpath);

        while (line != "Detail") {
            line = infile.ReadLine();
                    }

        while (!infile.EndOfStream)
        {
            line = infile.ReadLine();
            outfile.WriteLine(line);
        }

        outfile.Dispose();
        infile.Dispose();

        Dts.Variables["DataFile"].Value=outpath;
        Dts.Variables["CounterPart"].Value = CounterPart;

        Dts.TaskResult = (int)ScriptResults.Success;
    }
}