根据文件名

时间:2017-02-16 18:40:35

标签: visual-studio ssis

我必须从文件夹(C:\ Users)中按顺序(首先是第一个文件)选择文件,文件名中包含时间戳。 例如,下面是我在C:\ Users \中的文件,时间戳在第一个下划线之后,即下面第一个文件中的20170126102806。我必须遍历文件并选择第一个文件,依此类推。所以在下面的5个文件中,20170123-000011_20170126101823_AAA是第一个文件。我如何在SSIS中执行此操作?

1.20170123-000011_20170126102806_AAA
2.20170123-000011_20170126103251_AAA
3.20170123-000011_20170126101823_AAA
4.20170123-000011_20170126103305_AAA
5.20170123-000011_20170126102641_AAA

2 个答案:

答案 0 :(得分:0)

您可以采取两种方式:

  • 使用foreach循环容器获取文件列表,然后填充数据库表。
    然后,在foreach循环之外,使用Execute SQL使用适当的ORDER BY从该表中进行选择。
    使用结果集加载对象变量。然后使用第二个foreach循环逐步执行变量对象并收集文件。
  • 使用脚本任务检索文件夹的内容(文件列表)并对文件进行排序,然后使用数据集加载对象变量。然后使用foreach循环逐步执行变量对象以收集文件。

我希望这有帮助。

答案 1 :(得分:0)

您可以在For Each循环中使用脚本任务。使用返回的文件名作为源来加载每次。

using System.IO;

public void Main()
{
string filePath = "D:\\Temp";
DirectoryInfo dir = new DirectoryInfo(filePath);
var files = dir.GetFiles("*_AAA");//Or from a variable
DateTime fileCreateDate1 = File.GetCreationTime(filePath + "\\" + files[0]);
        if (files.Length >= 2)
        {
            for (int i = 1; i < files.Length; i++)
            {
                DateTime fileCreateDate2 = File.GetCreationTime(filePath+ "\\" + files[i]);

                if (fileCreateDate1 < fileCreateDate2)
                {
                    fileCreateDate1 = fileCreateDate2; 
                }
            }   
        }

        Dts.Variables["User::FileToLoad"].Value = fileCreateDate1;
        Dts.TaskResult = (int)ScriptResults.Success;
    }

您必须在加载文件后删除该文件,否则每次都会加载该文件,因为它是最旧或最新的文件。 可能有一个错误,但有类似的代码可行。如果需要的话就把它搞定。