【问题标题】:SSIS - Fixed number of columns in flat file sourceSSIS - 固定平面文件源中的列数
【发布时间】:2017-09-22 14:21:50
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: c# sql-server ssis


    【解决方案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 的行并使用正则表达式来检查类似的内容。

    【讨论】:

      【解决方案2】:

      在 Chris Mack 上进行扩展:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 2011-02-17
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多