【问题标题】:how to check end of file in a csv file before processing it in ssis如何在 ssis 中处理之前检查 csv 文件中的文件结尾
【发布时间】:2023-03-07 05:54:02
【问题描述】:

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

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

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

怎么做。请帮忙。

提前致谢。

【问题讨论】:

  • 您可以添加一个脚本任务(在 ForEach 循环容器内)来读取整个文件并在找到“END OF FILE”标记时设置一个标志。然后根据标志,您将转到 DFT 或引发错误。

标签: sql-server-2008 ssis


【解决方案1】:

创建变量check

Name   DataType  Value
check  int        0

假设你有一个像下面这样的包装设计

脚本任务是检查last row处有End of File的文件

在脚本任务中,在ReadWriteVariable 部分添加变量check,在ReadOnlyVariables 中添加来自ForEach container 的输出变量(假设变量名为LoopFiles

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

 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;
 }

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

【讨论】:

    【解决方案2】:

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

    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 时处理

    【讨论】:

      【解决方案3】:

      此解决方案可避免逐行读取整个文件。为了完整起见,我在这里合并了 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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 2014-03-13
        • 2011-01-29
        • 1970-01-01
        相关资源
        最近更新 更多