SSIS - 固定平面文件源中的列数

时间:2017-09-22 14:21:50

标签: c# sql-server ssis

我在目录中有许多文本文件,这些文件有一组由制表符分隔的列[6]。我使用'平面文件源'将其读入SSIS包中。块。如果文件的列数多于所需数量,或者任何列中缺少数据,我想拒绝此文件。

我已经使用各种示例文件进行了一些测试。每当我添加其他列时,程序都会接受这些文件。当列数较少时,它会抛出错误。

但是,有没有办法指定文件必须有一定数量的列,并且每个列中必须存在数据?

我对SSIS没有多少经验,所以我很感激任何建议。

谢谢

2 个答案:

答案 0 :(得分:1)

我会使用脚本任务来执行此操作。

您可以使用System.IO.StreamReader打开文件并阅读标题行,然后对结果字符串执行所需的任何验证。

我还会在SSIS包中创建一个布尔变量,称为'FileIsValid',我将写入(来自脚本任务)如果条件满足则为True,如果不满足则为False。然后,我将使用它来使用优先约束来指导包流。

这样的事情:

public void Main()
{
    System.IO.StreamReader reader = null;

    try
    {
        Dts.Variables["User::FileIsValid"].Value = false;

        reader = new System.IO.StreamReader(Dts.Variables["User::Filepath"].Value.ToString());

        string header = reader.ReadLine();

        if (header.Trim() == "Column1\tColumn2\tColumn3\tColumn4\tColumn5\tColumn6")
            Dts.Variables["User::FileIsValid"].Value = true;

        reader.Close();
        reader.Dispose();

        Dts.TaskResult = (int)ScriptResults.Success;
    }
    catch
    {
        if (reader != null)
        {
            reader.Close();
            reader.Dispose();
        }

        throw;
    }
}

关于检查所有列中是否有数据,是否需要每行?

您可以继续使用StreamReader阅读这些行,并使用正则表达式来检查这样的内容。

答案 1 :(得分:0)

扩展Chris Mack:

如果文件没有标题,您可以进行计数。

char[] delim = new char[] {'\t'};
if(header.Split(delim).Length() == 5)
...