SSIS 如何将多个 .ZIP 文件提取到多个文件夹
SSIS How To Extract Multiple .ZIP Files To Multiple Folders
Problem/Scenario:
在一个目录中,我有多个 .zip 存档。其中每一个都包含多个 .csv 文件。我需要将每个 .zip 存档的内容提取到与源 .zip 存档同名的目录中:
C:\MyDirectory\Data1.zip extract files to C:\MyDirectory\Data1
C:\MyDirectory\Data2.zip extract files to C:\MyDirectory\Data2
我有一个包含执行进程任务的 Foreach 循环。该任务使用 7zip 来提取每个目录的内容。此任务设置了以下变量:
varZipSourceFolder = \<server>\c$\MyDirectory
varZipDestination = \<server>\c$\MyDirectory\
varZipFileName
varExePath = C:\Program Files-Zipz.exe
问题是,截至目前,任务已成功运行并从第一个存档中提取文件。但是,当从下一个 .zip 存档中提取时,它试图提取到创建的第一个目录:
C:\MyDirectory\Data1.zip is extracting to C:\MyDirectory\Data1
C:\MyDirectory\Data2.zip is extracting to C:\MyDirectory\Data1
以下是 VS2008 中 SSIS 项目的一些屏幕截图:
ForEach 循环:
执行进程任务:
非常感谢任何帮助!另外,如果我需要以任何方式编辑问题以帮助更好地传达我的问题,请告诉我。
所以经过大量的时间和亵渎,我明白了。
我最终使用@Joost 的自定义 Unzip Task 来处理解压缩,但是获取它和配置为解决我的特定问题的 ForEach 循环本身就是一项艰巨的任务。
我继续使用@Joost 和@billinkc 的评论重新创建了我的变量。我花了一秒钟,但我终于能够理解他们所指的变量 "slice and dice"。
我会尽力传达所做的工作,以防其他人在他们的研究中遇到这个问题。
Answer/Solution:
首先,我从头开始重新创建变量。我特别确保包含一个将用于 Joost 的解压缩任务的目标变量,以及一个作为源变量。这些变量与其他变量定义一起被评估为下面的表达式:
varUnzipTaskSource = @[User::varServer] + "\" + @[User::varZipSource] + "\" + @[User::varZipFile] + ".zip"
varUnzipTaskDestination = @[User::varServer] + "\" + @[User::varZipSource] + "\" + @[User::varZipFile] + "\"
varServer = \MyServer\c$
varZipSource = \MyFolder
varZipFile = MyFileName (no extension in the filename)
接下来,我将我的 ForEach 循环容器设置如下:
注意:使用 UNC 路径和 select 仅名称
注意:仅名称 selection 将用于创建目标目录。
现在解压缩任务配置:
总而言之,将通往源头和目的地的路径分开是关键。 ForEach 循环仅获取每个 .zip 存档的名称,根据该值创建一个目录,然后将数据提取到其中。
我也会尝试在不使用 Joost 的自定义任务的情况下让它工作。我将使用该信息更新此答案(如果可能)。
再次感谢@Joost 和@billinkc 让我朝着正确的方向前进。
Problem/Scenario:
在一个目录中,我有多个 .zip 存档。其中每一个都包含多个 .csv 文件。我需要将每个 .zip 存档的内容提取到与源 .zip 存档同名的目录中:
C:\MyDirectory\Data1.zip extract files to C:\MyDirectory\Data1
C:\MyDirectory\Data2.zip extract files to C:\MyDirectory\Data2
我有一个包含执行进程任务的 Foreach 循环。该任务使用 7zip 来提取每个目录的内容。此任务设置了以下变量:
varZipSourceFolder = \<server>\c$\MyDirectory
varZipDestination = \<server>\c$\MyDirectory\
varZipFileName
varExePath = C:\Program Files-Zipz.exe
问题是,截至目前,任务已成功运行并从第一个存档中提取文件。但是,当从下一个 .zip 存档中提取时,它试图提取到创建的第一个目录:
C:\MyDirectory\Data1.zip is extracting to C:\MyDirectory\Data1
C:\MyDirectory\Data2.zip is extracting to C:\MyDirectory\Data1
以下是 VS2008 中 SSIS 项目的一些屏幕截图:
ForEach 循环:
执行进程任务:
非常感谢任何帮助!另外,如果我需要以任何方式编辑问题以帮助更好地传达我的问题,请告诉我。
所以经过大量的时间和亵渎,我明白了。
我最终使用@Joost 的自定义 Unzip Task 来处理解压缩,但是获取它和配置为解决我的特定问题的 ForEach 循环本身就是一项艰巨的任务。
我继续使用@Joost 和@billinkc 的评论重新创建了我的变量。我花了一秒钟,但我终于能够理解他们所指的变量 "slice and dice"。
我会尽力传达所做的工作,以防其他人在他们的研究中遇到这个问题。
Answer/Solution:
首先,我从头开始重新创建变量。我特别确保包含一个将用于 Joost 的解压缩任务的目标变量,以及一个作为源变量。这些变量与其他变量定义一起被评估为下面的表达式:
varUnzipTaskSource = @[User::varServer] + "\" + @[User::varZipSource] + "\" + @[User::varZipFile] + ".zip"
varUnzipTaskDestination = @[User::varServer] + "\" + @[User::varZipSource] + "\" + @[User::varZipFile] + "\"
varServer = \MyServer\c$
varZipSource = \MyFolder
varZipFile = MyFileName (no extension in the filename)
接下来,我将我的 ForEach 循环容器设置如下:
注意:使用 UNC 路径和 select 仅名称
注意:仅名称 selection 将用于创建目标目录。
现在解压缩任务配置:
总而言之,将通往源头和目的地的路径分开是关键。 ForEach 循环仅获取每个 .zip 存档的名称,根据该值创建一个目录,然后将数据提取到其中。
我也会尝试在不使用 Joost 的自定义任务的情况下让它工作。我将使用该信息更新此答案(如果可能)。
再次感谢@Joost 和@billinkc 让我朝着正确的方向前进。