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

时间:2013-03-28 10:14:38

标签: sql-server-2008 ssis

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

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

如果最后一行中包含“END OF FILE”,则只处理这些CSV文件。

怎么做呢。请帮忙。

提前致谢。

3 个答案:

答案 0 :(得分:2)

创建变量check

Name   DataType  Value
check  int        0

假设您有一个类似下面的包装设计

enter image description here

脚本任务是检查End of File

last row的文件

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

在脚本任务中添加以下代码以读取文件。有几种方法可以读取文件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;
 }

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

enter image description here

答案 1 :(得分:0)

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

  1. 创建以下变量:
  2. EOF_Found布尔

    Row_Count Integer

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

答案 2 :(得分: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;
    }