我对SSIS有一个有趣的挑战。使用for-each文件枚举器,我需要选择最近创建的子文件夹,然后遍历每个文件。
也许一个例子会更好地解释。文件夹看起来像这样:
C:\数据\ 2011-0703
C:\数据\ 2011-0626
C:\数据\ 2011-0619
如何为每个文件枚举器选择最新的文件夹?这可以通过查看创建日期或比较文件名来实现。
我猜它会在枚举器中用表达式完成,只是不知道怎么做!在网上找不到任何东西。
由于
答案 0 :(得分:5)
您可以在Script Task
的帮助下实现此目的。以下示例显示了如何完成此操作。该示例是在SSIS 2008 R2中创建的。
分步流程:
在文件夹路径2011-0619
中创建名为2011-0626
,2011-0703
和C:\temp\
的三个文件夹,如屏幕截图# 1 所示。记下每个文件夹的Date created
值。
在每个文件夹中放置少量文件,如屏幕截图# 2 - # 4 所示。
在SSIS包上,创建四个变量,如屏幕截图# 5 所示。使用值C:\temp\
设置变量 RootFolder (在您的情况下,这将是c:\ data)。将变量 FilePattern 设置为值*.*
。变量 RecentFolder 将在脚本任务中分配最近的文件夹路径。要避免设计时错误,请为变量 RecentFolder 指定有效的文件路径。当文件在最近的文件夹中循环时,将为变量 FilePath 分配值。
在SSIS包上,放置一个脚本任务。将脚本任务中的Main()方法替换为脚本任务代码(获取最近的文件夹)部分下的脚本任务代码。此脚本获取根文件夹中的文件夹列表,并循环检查创建日期时间以选择最近创建的文件夹。最近创建的文件夹路径随后存储在变量 RecentFolder 中。
在SSIS包上,放置一个Foreach循环容器并按照屏幕截图# 6 和# 7 所示进行配置。
将一个脚本任务放在Foreach循环容器中。将脚本任务中的Main()方法替换为脚本任务代码(显示文件名)部分下的脚本任务代码。此脚本只显示最近创建的文件夹中的文件名称。
配置完所有任务后,该软件包应如屏幕截图# 8 所示。
屏幕截图# 9 - # 11 显示该程序包在最近创建的文件夹 2011-0703 中显示文件名。
希望有所帮助。
脚本任务代码(获取最近的文件夹):
C#代码只能在 SSIS 2008及以上版本中使用。
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::RootFolder");
Dts.VariableDispenser.LockForWrite("User::RecentFolder");
Dts.VariableDispenser.GetVariables(ref varCollection);
string rootFolder = varCollection["User::RootFolder"].Value.ToString();
DateTime previousFolderTime = DateTime.MinValue;
string recentFolder = string.Empty;
foreach (string subFolder in System.IO.Directory.GetDirectories(rootFolder))
{
DateTime currentFolderTime = System.IO.Directory.GetCreationTime(subFolder);
if (previousFolderTime == DateTime.MinValue || previousFolderTime <= currentFolderTime)
{
previousFolderTime = currentFolderTime;
recentFolder = subFolder;
}
}
varCollection["User::RecentFolder"].Value = recentFolder;
Dts.TaskResult = (int)ScriptResults.Success;
}
脚本任务代码(显示文件名):
C#代码只能在 SSIS 2008及以上版本中使用。
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForRead("User::FilePath");
Dts.VariableDispenser.GetVariables(ref varCollection);
MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");
Dts.TaskResult = (int)ScriptResults.Success;
}
屏幕截图#1:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10:
屏幕截图#11:
答案 1 :(得分:0)
遍历文件夹。保存第一个的名称。将该保存的值与每个后续文件夹的名称进行比较。如果下一个文件夹是更新的,请交换该名称并继续。最后,您保存的值将是最新文件夹的名称(如果您要比较创建日期,则需要同时保存文件夹名称和创建日期。)
然后,您可以将保存的值用作第二个迭代循环的参数。