Sql server 2008 如何在ssis中处理csv文件之前检查该文件的结尾

Sql server 2008 如何在ssis中处理csv文件之前检查该文件的结尾,sql-server-2008,ssis,Sql Server 2008,Ssis,我创建了一个SSIS包,它使用ForEachLoop容器处理.CSV文件 所有csv文件的最后一行都包含“文件结束” 如果最后一行包含“文件结束”,则仅处理这些CSV文件 怎样才能做到呢。请帮忙 提前谢谢 有很多方法可以做到这一点。一种方法是: 创建以下变量: EOF_是布尔型的 行计数整数 使用平面文件源将数据引入数据流 使用行计数组件将行数添加到行计数中,以便稍后识别最后一行 使用脚本组件在行之间循环,为每行的计数器添加1 当您的计数器等于Row_Count(即,您正在查看最后一行)中的值时

我创建了一个SSIS包,它使用ForEachLoop容器处理.CSV文件

所有csv文件的最后一行都包含“文件结束”

如果最后一行包含“文件结束”,则仅处理这些CSV文件

怎样才能做到呢。请帮忙


提前谢谢

有很多方法可以做到这一点。一种方法是:

  • 创建以下变量:
  • EOF_是布尔型的

    行计数整数

  • 使用平面文件源将数据引入数据流
  • 使用行计数组件将行数添加到行计数中,以便稍后识别最后一行
  • 使用脚本组件在行之间循环,为每行的计数器添加1
  • 当您的计数器等于Row_Count(即,您正在查看最后一行)中的值时,请检查希望显示“文件结束”的列中的值(取决于您如何设置平面文件连接管理器)。如果它等于“文件结束”,则将EOF_find的值更改为True
  • 在脚本组件之后,添加引用EOF_Found中的值的派生列
  • 使用条件拆分,检查派生列的值,如果为True,则仅处理

  • 创建变量
    检查

    Name   DataType  Value
    check  int        0
    
    假设您有一个如下所示的包设计

    脚本任务是检查在
    最后一行有
    文件结尾的文件

    在脚本任务中,在
    ReadWriteVariable
    部分添加变量
    check
    ,并在
    ReadOnlyVariables
    中添加每个容器的输出变量
    ForEach
    (假设变量名为
    LoopFiles

    在脚本任务中,添加以下代码来读取文件

    双击绿色箭头连接脚本任务和数据流任务。将打开一个优先对话框并输入表达式,如下所示


    此解决方案避免逐行读取整个文件。为了完整起见,我在这里合并了Praveen的代码

        public void Main()
        {
            string line = ReadLastLine(@"c:\temp\EOF.cs");
    
             if (line.ToUpper() == "END OF FILE")
             { 
                 Dts.Variables["User::check"].Value = 1;
             }
    
        Dts.TaskResult = (int)ScriptResults.Success;
        }
    
        public static string ReadLastLine(string path)
        {
            StreamReader stream = new StreamReader(path);
            string str = stream.ReadToEnd();
            int i = str.LastIndexOf('\n');
            string lastLine = str.Substring(i + 1);
            return lastLine;
        }
    
    您可以添加一个脚本任务(在ForEach循环容器中)来读取其中的整个文件,并在找到“文件结束”标记时设置一个标志。根据标志,您将转到DFT或引发错误。
        public void Main()
        {
            string line = ReadLastLine(@"c:\temp\EOF.cs");
    
             if (line.ToUpper() == "END OF FILE")
             { 
                 Dts.Variables["User::check"].Value = 1;
             }
    
        Dts.TaskResult = (int)ScriptResults.Success;
        }
    
        public static string ReadLastLine(string path)
        {
            StreamReader stream = new StreamReader(path);
            string str = stream.ReadToEnd();
            int i = str.LastIndexOf('\n');
            string lastLine = str.Substring(i + 1);
            return lastLine;
        }