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

Posted

技术标签:

【中文标题】如何在 ssis 中处理之前检查 csv 文件中的文件结尾【英文标题】:how to check end of file in a csv file before processing it in ssis 【发布时间】:2013-03-18 17:33:27 【问题描述】:

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

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

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

怎么做。请帮忙。

提前致谢。

【问题讨论】:

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

创建变量check

Name   DataType  Value
check  int        0

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

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

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

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

 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】:

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

    创建以下变量:

EOF_Found 布尔值

Row_Count 整数

    使用平面文件源将数据引入数据流 使用行计数组件将行数添加到 Row_Count,以便稍后识别最后一行 使用脚本组件循环遍历行,为每行的计数器加 1 当您的计数器等于 Row_Count 中的值(即您正在查看最后一行)时,检查您希望“END OF FILE”出现的列中的值(取决于您如何设置平面文件连接管理器) .如果它等于“END OF FILE”,则将 EOF_Found 的值更改为 True 在脚本组件之后,添加引用 EOF_Found 中的值的派生列 使用条件拆分,检查派生列的值,仅在 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;
    

【讨论】:

以上是关于如何在 ssis 中处理之前检查 csv 文件中的文件结尾的主要内容,如果未能解决你的问题,请参考以下文章

基于发票行项目检查的 SSIS SQL 拆分文件

在SSIS中导入CSV:截断错误

如何在 SSIS 包中使用变量和 SQL 代码?

如何使用 SSIS 将 File1 标头中的单个值与 File2 中的总行数进行比较(csv)

SSIS输出日期为DD / MM / YYYY 00:00:00

ssis 中的表达式不支持对象变量的数据类型