0

我有一个要处理文件的来源。多个文件随时随机到达该位置(包应每 2 小时运行一次)。我必须只处理新文件,我不能删除,从那个位置移动已经处理的文件。我只能将文件复制到存档位置。我怎样才能做到这一点?

4

3 回答 3

0

您的包应该处理给定目录中的文件,然后在处理后将它们移动到另一个目录。这样,每次包运行时,它都必须完全处理源目录。

要处理目录中的每个文件,请使用 ForEach 容器。您可以指定要查看的文件夹,以及要过滤的一些表达式。例如,如果您的文件名包含时间戳,则可以使用该时间戳将文件过滤入或过滤出。

您使用平面文件源来读取文件,然后使用文件系统任务来移动它们。

于 2012-11-05T14:08:12.953 回答
0

首先,请查看此处的答案:使用 SSIS 脚本任务枚举文件夹中的文件

SSIS 脚本任务应枚举给定文件夹中的所有文件,然后从表中获取已处理文件的快照,您将在该表中保存已处理的日志,忽略已处理的文件并仅返回未处理的文件for-each 任务使用的对象变量。

于 2012-11-05T14:58:22.447 回答
0

您可以使用以下步骤实现此目的。

  1. 对传入文件夹使用 foreach 文件枚举器,并将文件名保存在“IncomingFile”变量中。配置为选择“名称和扩展名”[在我的代码中我使用过,否则您需要对脚本进行一些修改]
  2. 创建两个 SSIS 变量,例如“ArchivePath”作为字符串,“IsLoaded”作为布尔值[默认为 false]。
  3. 创建 SSIS 脚本组件并使用“IncomingFile”和“ArchivePath”作为只读变量。“IsLoaded”应该是 ReadandWrite 变量。
  4. 在脚本组件中编写以下代码。如果文件已经存在,那么它将返回 true。否则为假。

    public void Main()
    {
        var archivePath = Dts.Variables["ArchivePath"].Value.ToString();
        var incomingFile = Dts.Variables["IncomingFile"].Value.ToString();
    
        var fileFullPath = string.Format(@"{0}\{1}",archivePath,incomingFile);
    
        bool isLoaded = File.Exists(fileFullPath);
    
        Dts.Variables["IsLoaded"].Value = isLoaded;
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    
  5. 使用 Precedence 约束调用数据流任务和评估操作应该是 "Expression" 。在您的表达式框中设置如下内容。

    @IsLoaded==False

希望这可以帮助。

于 2012-11-05T17:38:47.287 回答