在foreach循环中获取最旧的文件

时间:2012-11-22 14:27:09

标签: ssis foreach-loop-container

我在一个带有命名约定的文件夹中有多个文件

Name_MoreName_DDMMYYYY_SomeNumber_HHMMSS.txt

如何在foreach循环中只使用一个具有最早日期和时间的文件(即最早的DDMMYYYY和HHMMSS)。我被限制使用foreach循环。

前:

  • Name_MoreName_22012012_SomeNumber_072334.txt
  • Name_MoreName_22012012_SomeNumber_072134.txt
  • Name_MoreName_24012012_SomeNumber_072339.txt
  • Name_MoreName_22012012_SomeNumber_072135.txt

所以最旧的文件将是

Name_MoreName_22012012_SomeNumber_072134.txt

我怎样才能获取最旧的文件?

2 个答案:

答案 0 :(得分:3)

日期表达:

SUBSTRING(@ [User :: Filename],FINDSTRING(@ [User :: Filename],“_”,2)+1,8)

OldestDate Expression:

(DT_I4)(右(@ [User :: Date],4)+ SUBSTRING(@ [User :: Date],3,2)+ SUBSTRING(@ [User :: Date],1, 2))

脚本任务 - 我

Public Sub Main()
        Dim OldestDate As Integer
        Dim CurrentDate As Integer
        OldestDate = CType(Dts.Variables("OldestDate").Value, Integer)
        CurrentDate = CType(Dts.Variables("CurrentDate").Value, Integer)
        If OldestDate > CurrentDate Then
            Dts.Variables("OldestFile").Value = Dts.Variables("Filename").Value.ToString()
            Dts.Variables("CurrentDate").Value = CType(Dts.Variables("OldestDate").Value, Integer)
        End If
        Dts.TaskResult = Dts.Results.Success
    End Sub

脚本任务 - II

Public Sub Main()
        MsgBox(Dts.Variables("OldestFile").Value.ToString())
        Dts.TaskResult = Dts.Results.Success
End Sub

enter image description here

<强>解释

这里的基本思路是获取日期部分,即DDMMYYYY并将其转换为YYYYMMDD。 现在,只要日期是YYYYMMDD格式,我们就可以通过简单的整数比较来比较哪个日期更大。我们首先将第一个文件的日期与 19000101 (过去的日期)进行比较,然后在脚本任务中看到 - 我,我们将 OldestFile 有效的文件名脚本任务 - II 打印出具有最早日期的文件名。

答案 1 :(得分:2)

现有的Foreach(文件)枚举器在这种情况下是不够的,因为它仅限于文件名掩码。根据您的需要,您正在查看脚本任务以填充某些内容。这些内容是否只是一个变量,然后用于配置平面文件连接管理器的ConnectionString属性,或者是否需要生成所有旧文件的列表(如果您需要识别Name_MoreName_OldestDate和Name_OtherName_OldestDate),将其分配给变量然后使用Foreach枚举器(变量)将取决于您的确切业务需求。

如果你可以使用修改后的日期/时间,那么这个答案将是这个答案中逻辑的反转 Import most recent csv file to sql server in ssis否则,没有LINQ乐趣的类似逻辑。使用DirectoryInfo调用浏览文件夹中的所有文件,然后比较文件名。

如果您需要更详细的解释,请与我们联系。