3

命名規則のあるフォルダに複数のファイルがあります

Name_MoreName_DDMMYYYY_SomeNumber_HHMMSS.txt

日付と時刻が最も古い(つまり、最も古いDDMMYYYYとHHMMSS)foreachループで1つのファイルのみを取得するにはどうすればよいですか。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)

OldestDate式:

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

スクリプトタスク-I

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(かなり過去の日付)と比較することから始め、次にスクリプトタスクで見られるように-I、OldestFileFilenameを条件付きで割り当てます。スクリプトタスク-IIは、最も古い日付のファイル名を出力します。

于 2012-11-23T10:45:14.007 に答える
2

この場合、既存のForeach(ファイル)列挙子はファイル名マスクに制限されているため、十分ではありません。必要に応じて、何かを設定するためのスクリプトタスクを検討していますその何かがフラットファイル接続マネージャーのConnectionStringプロパティを構成するために使用される単なる変数であるかどうか、またはすべての古いファイルのリストを生成する必要があるかどうか(Name_MoreName_OldestDateとName_OtherName_OldestDateを識別する必要がある場合)、それをに割り当てます変数を使用してからForeach列挙子(変数)を使用するかどうかは、正確なビジネスニーズによって異なります。

変更された日付/時刻を使用できる場合、この回答はこの回答のロジックの反転になり ます。最新のcsvファイルをssisのSQLサーバーにインポートします 。それ以外の場合は、LINQの楽しみのない同様のロジック。DirectoryInfo呼び出しを使用してフォルダー内のすべてのファイルを調べ、ファイル名を比較します。

より詳細な説明が必要な場合はお知らせください。

于 2012-11-23T00:12:24.193 に答える