SSIS - 将文件列表从一个文件夹移动到另一个文件夹

时间:2016-06-07 18:23:58

标签: ssis

我有一个包含大约10,000个PDF文档的SourceFolder文件夹。

我有一个列表(FileList.csv),其中包含大约1,000个文件的名称。

我想将该列表中的文件从它们所在的文件夹移动到我创建的空文件夹(DestFolder)。我正在使用SSIS 2013。

作为一个概念验证,我使用ForEachItem枚举器成功配置了一个ForEachLoop容器,其中包含一个FileSystem任务,并移动了两个文件。

但是,我必须在ForEachLoop编辑器中手动输入文件名 - >收藏 - >枚举器配置窗口。

我为FileName,SourceFolder和FullSourcePath配置了变量,一切正常。

我的问题是 - 如何连接到平面文件以将文件名转换为变量?

我不允许发布图片,所以我会尝试解释我的尝试。

  1. 添加一个平面文件源和连接管理器,并使用CM Propoerties中的表达式将FileName变量分配给连接字符串(没有运气)

  2. 将FlatFile Source提供给RecordSet Destination并将结果集分配给ObjectVariable,并将ForEach循环容器配置更改为ForEach ADO枚举器,并将ObjectVariable分配给ADO源对象变量(没有运气)。

  3. 这似乎是一项如此简单的任务,我希望我遗漏了一些明显的东西。不包括图像的Aopologies。

3 个答案:

答案 0 :(得分:0)

  1. 创建一个Object类型的变量来存储您的文件名。
  2. 在脚本任务中,使用文件名填充字符串数组并将其分配给对象。
  3. 在脚本任务和foreach容器之间创建优先约束。
  4. 在foreach循环容器的“集合”选项卡中,选择 Foreach From Variable Enumerator 作为枚举器类型。
  5. 在变量映射选项卡中,选择将在枚举期间存储当前文件名的变量。

答案 1 :(得分:0)

我终于开始工作,并认为我会为可能面临同样问题的其他人发布我的解决方案。

我使用带有嵌入式查询的SQL任务直接从数据库中获取文件名列表。

我将它输入到一个内部有文件系统任务的ForEachLoop容器中。

我创建了以下变量:

  • SourceFolder |字符串| B:\桌面\源\
  • DestFolder |字符串| B:\桌面\站Dest \
  • FileName |字符串|
  • FileList |对象|
  • FileFullPath | String | (Expr :) @ [User :: SourceFolder] + @ [UserFileName]

连接经理

  • 数据库的OLE DB(显然)
  • DestFolder | UsageType:|现有文件夹 |浏览到文件夹
  • SourceFolder |使用类型:|现有文件 |指向文件夹
  • 中的任何文件
  • 重要信息:在SourceFolder连接管理器中,设置以下表达式:
  • ConnectionString | @ [用户:: FileFullPath]

SQL任务编辑器中一般窗口:

  1. ResultSet 设置为完整结果集
  2. 将查询粘贴到 SQL语句
  3. SQL任务编辑器中ResultSet 窗口:

    1. 结果名称= 0
    2. 变量名称= User :: FileList
    3. ForEach循环编辑器中|收藏窗口:

      1. Enumerator = ForeachADO Enumerator
      2. ADO对象源变量= User :: FileList
      3. 枚举模式=第一张表中的行
      4. ForEach循环编辑器中|变量映射窗口:

        1. Variable = User :: Filename
        2. 指数= 0
        3. ForEach循环编辑器属性

          1. 将最大错误计数设置为大于您要循环的文件数的某个数字。 (这包括您的查询生成不在源文件夹中的文件名的情况。我确信有更优雅的方式来执行此操作,我期待有一天能够学习它!)
          2. 文件系统任务编辑器中|一般窗口:

            1. IsDestinationPathVariable = False
            2. DestinationConnection = DestFolder
            3. 操作= MoveFile
            4. IsSourcePathVariable = False
            5. SourceConnection = SourceFolder
            6. 文件系统任务属性窗口中:

              1. 设置最大错误计数> SourceFolder中的文件数
              2. 现在,程序包将运行并为FileList中的每个文件名生成一个错误,该文件在源文件夹中没有匹配的文件,但它将运行并移动文件。

                陷阱:

                1. 别忘了" \"在文件路径变量的末尾
                2. 不要忘记在“源连接管理器属性”窗口中设置表达式(参见上文)。
                3. 感谢大家的帮助。

答案 2 :(得分:0)

更快的方法来实现这一目标!

删除foreach循环任务。 在集合下选择Foreach文件枚举器。 文件夹是文件的位置。 c:\ SrcFiles保留完全限定,并放入.txt或任何文件扩展名 在变量映射下添加名为FileName字符串类型的变量,并确保它在包的范围内

将文件系统任务拖放到容器中 源变量是FileName 目标连接是您要移动到的位置。 d:\ ReceivedFiles 覆盖目的地=真 DelayValidation = True

瞧!