导入带有动态列的文件

本文关键字:文件 动态 导入 | 更新日期: 2023-09-27 18:03:04

我是SSIS和c#的新手。在SQL Server 2008中,我从。csv文件导入数据。现在我有了动态列。它们可以在22列左右(有时更多或更少)。我创建了一个包含25列的staging表,并将数据导入其中。实际上,我导入的每个平面文件都有不同数量的列。它们都是正确格式化的。我的任务是从.csv平面文件中导入所有行,包括标题。我想把它放在一个作业中,这样我就可以每天将多个文件导入到表中。

因此,在a for每个循环中,我有一个数据流任务,其中有一个脚本组件。我上来了(在线研究)与下面的c#代码,但我得到错误:

索引超出数组边界

我试图找到使用MessageBox的原因,我发现它正在读取第一行,索引在第一行之后超出了数组的边界。

1)。我需要你帮忙修复代码

2)。我的File1Conn是平面文件连接,而不是我想直接从变量User::FileName读取它,我的foreach循环不断更新。请帮忙修改下面的代码

这是我的平面文件:

https://drive.google.com/file/d/0B418ObdiVnEIRnlsZFdwYTRfTFU/view?usp=sharing

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Windows.Forms;
using System.IO;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
 private StreamReader SR;
 private string File1;
public override void AcquireConnections(object Transaction)
{
    // Get the connection for File1
    IDTSConnectionManager100 CM = this.Connections.File1Conn;
    File1 = (string)CM.AcquireConnection(null);
}
public override void PreExecute()
{
    base.PreExecute();
    SR = new StreamReader(File1);
}
public override void PostExecute()
{
    base.PostExecute();
    SR.Close();
}
public override void CreateNewOutputRows()
{
    // Declare variables
    string nextLine;
    string[] columns;
    char[] delimiters;
    int Col4Count;
    String[] Col4Value = new string[50];
    // Set the delimiter
    delimiters = ";".ToCharArray();
    // Read the first line (header)
    nextLine = SR.ReadLine();
    // Split the line into columns
    columns = nextLine.Split(delimiters);
    // Find out how many Col3 there are in the file
    Col4Count = columns.Length - 3;
    //MessageBox.Show(Col4Count.ToString());
    // Read the second line and loop until the end of the file
    nextLine = SR.ReadLine();
    while (nextLine != null)
    {
        // Split the line into columns
        columns = nextLine.Split(delimiters);
        {
            // Add a row
            File1OutputBuffer.AddRow();

            // Set the values of the Script Component output according to the file content
            File1OutputBuffer.SampleID = columns[0];
            File1OutputBuffer.RepNumber = columns[1];
            File1OutputBuffer.Product = columns[2];
            File1OutputBuffer.Col1 = columns[3];
            File1OutputBuffer.Col2 = columns[4];
            File1OutputBuffer.Col3 = columns[5];
            File1OutputBuffer.Col4 = columns[6];
            File1OutputBuffer.Col5 = columns[7];
            File1OutputBuffer.Col6 = columns[8];
            File1OutputBuffer.Col7 = columns[9];
            File1OutputBuffer.Col8 = columns[10];
            File1OutputBuffer.Col9 = columns[11];
            File1OutputBuffer.Col10 = columns[12];
            File1OutputBuffer.Col11 = columns[13];
            File1OutputBuffer.Col12 = columns[14];
            File1OutputBuffer.Col13 = columns[15];
            File1OutputBuffer.Col14 = columns[16];
            File1OutputBuffer.Col15 = columns[17];
            File1OutputBuffer.Col16 = columns[18];

        }
        // Read the next line
        nextLine = SR.ReadLine();
    }
}
}

导入带有动态列的文件

正如您提到的文件具有动态的列数,在脚本组件中您需要按分隔符计算列数,然后重定向到不同的输出。

对于第二个问题,您可以将变量分配给平面文件连接管理器连接字符串属性。然后你可以直接在脚本中读取变量值。

除了脚本组件,您可以通过使用一个虚拟分隔符创建一个"一列"平面文件源,然后在数据流任务中,您可以将一定数量的列读入一个变量,有条件地拆分数据流,将输出重定向到不同的目的地。可以在http://sqlcodespace.blogspot.com.au/2015/03/ssis-design-pattern-handling-flat-file.html

找到一个示例