3

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

Name_MoreName_DDMMYYYY_SomeNumber_HHMMSS.txt

如何在具有最旧日期和时间(即最旧的 DDMMYYYY 和 HHMMSS)的 foreach 循环中只获取一个文件。我被限制使用 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

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

4

2 回答 2

3

日期表达式:

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

最旧日期表达式:

(DT_I4) (RIGHT(@[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

在此处输入图像描述

解释:

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

于 2012-11-23T10:45:14.007 回答
2

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

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

如果您需要更详细的解释,请告诉我。

于 2012-11-23T00:12:24.193 回答