在SSIS中读取平面文件时跳过不需要的行

时间:2015-01-23 05:43:23

标签: ssis

我有一个SSIS包试图从文本文件中读取数据。我面临的问题是文本文件没有非常简单的数据,因为它有特殊的字符,这会造成麻烦

例如,在标题行之后,有一行充满连字符,类似-------------------------- -------------------------------------------------- -------------

此SSIS正在读取第一列的第一个值,因为它失败了。如何在不实际从文件本身删除行的情况下摆脱这种情况?

此外,在文件的后面部分,还有一些我想忽略的不需要的行,文件的格式是这样的:

标题

数据

随机行

与上面相同的标题行

数据

依旧.....

我想知道在平面文件来源之前或期间是否有办法通过脚本任务或任何其他方式处理此问题。任务被执行,而不实际在原始文件中进行更改。

1 个答案:

答案 0 :(得分:2)

我还不知道要使用Flat File Source组件在输入上过滤这些行,但是如果用脚本组件读取文件,你肯定可以做一些过滤。

如果添加对Microsoft.VisualBasic的引用,则可以使用以下函数将CSV读入数据表:

public static DataTable ReadInDataFromCSV(string fileName, string delimiter)
{
    DataTable dtOutput = new DataTable();
    //How many lines to read in.  0 for unlimited
    int numberOfLines = 0;

    using (TextFieldParser parser = new TextFieldParser(fileName))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(delimiter);
        //Are column names in first row?
        bool columnNamesInFirstRow = true;
        int rowCounter = 0;
        string[] currentRow;
        while (!parser.EndOfData && rowCounter <= numberOfLines)
        {
            try
            {
                currentRow = parser.ReadFields();
                /*****************************
                Add some kind of logic here to skip over rows you don't
                want to read in
                *****************************/

                if (columnNamesInFirstRow == true)
                {
                    foreach (string column in currentRow)
                    {
                        dtOutput.Columns.Add(column);
                    }
                    columnNamesInFirstRow = false;
                }
                else
                {
                    DataRow dr;
                    dr = dtOutput.NewRow();
                    dr.ItemArray = currentRow;
                    dtOutput.Rows.Add(dr);
                    columnNamesInFirstRow = false;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            rowCounter += (numberOfLines == 0) ? 0 : 1;
        }
    }

    return dtOutput;
}

默认情况下,上面的代码会通过调用类似于

的内容将平面文件读入DataTable
DataTable myInputData = ReadInDataFromCSV(@"Path to file",",")

如果您修改我在try / catch中添加的推荐,您可以过滤掉您不感兴趣的行。例如,要跳过带有超量的行,您可以添加一个简单的检查,如:< / p>

if (currentRow.IndexOf("-----") > 0)
{
    continue;
}
else
{
    //If/else statement from the original code that adds the data to a DataRow and then adds it to the DataTable
}

然后,您只需添加更多类似的检查即可包含/不包含文件中的某些行。祝你好运!