0

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

所有 csv 文件的最后一行都包含“END OF FILE”。

只有那些在最后一行包含“END OF FILE”的 CSV 文件才会被处理。

怎么做到呢。请帮忙。

提前致谢。

4

3 回答 3

2

创建变量check

Name   DataType  Value
check  int        0

假设您有一个如下所示的包装设计

在此处输入图像描述

脚本任务是检查End of Filelast row

在脚本任务中添加变量checkinReadWriteVariable部分和输出变量 from ForEach container(假设变量名称是LoopFiles) inReadOnlyVariables

在脚本任务中添加以下代码来读取文件。有几种方法可以在这里这里读取文件

 public void Main()
    {
     int counter = 0;
     string loop=  Dts.Variables["User::LoopFiles"].Value.ToString();
     string line;
      using (StreamReader files = new StreamReader(file))
         {
             while((line = files.ReadLine()) != null)
                {
                    if (line.ToLower() == "End Of File".ToLower())
                      { 
                          Dts.Variables["User::check"].Value = 1;
                       }
                }
         }
 Dts.TaskResult = (int)ScriptResults.Success;
 }

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

在此处输入图像描述

于 2013-03-28T11:09:36.190 回答
0

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

  1. 创建以下变量:

EOF_Found 布尔值

Row_Count 整数

  1. 使用平面文件源将数据引入数据流
  2. 使用行计数组件将行数添加到 Row_Count,以便稍后识别最后一行
  3. 使用脚本组件循环遍历行,为每行添加 1 到计数器
  4. 当您的计数器等于 Row_Count 中的值时(即您正在查看最后一行),请检查您希望“END OF FILE”出现的列中的值(取决于您如何设置平面文件连接管理器)。如果它等于“END OF FILE”,则将 EOF_Found 的值更改为 True
  5. 在脚本组件之后,添加一个引用 EOF_Found 中的值的派生列
  6. 使用条件拆分,检查派生列的值,仅在 True 时处理
于 2013-03-28T10:36:44.180 回答
0

该解决方案避免了逐行读取整个文件。为了完整起见,我在这里合并了 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;
    }
于 2013-03-28T22:27:11.330 回答