2012-01-27 9 views
0

ファイル名の部分に基づいてディレクトリ内のファイルをソートする方法はありますか?ファイル名に記載されているVisual BasicベースのタイムスタンプのFileSort

ファイル形式:同じXXXため
prod_orders_XXX_<TimeStamp>.datXXX = symbol of the product and the length may varies.
<TimeStamp> = date and time

複数のファイルを異なるタイムスタンプで可能です。

はここにいくつか例を示します。

prod_orders_abc_20122001083000.dat 
prod_orders_abc_20122007083111.dat 
prod_orders_xyz_20122003093157.dat 
prod_orders_xyz_20122001083000.dat 
prod_orders_abc_20122001163139.dat 
prod_orders_abc_20122002093137.dat 
prod_orders_xyz_20122001183000.dat 
prod_orders_abc_20122001163139.dat 
prod_orders_abc_20122001093137.dat 

私は、ファイル名の一部として言及したタイムスタンプに基づいてファイルをソートする必要があります。

+0

私は、値としてキーとファイル名(prod_orders_xyz)としてタイムスタンプを取ることによって、ハッシュテーブルを試してみましたが、ハッシュキーをarraylistに割り当てることでソートします。同じタイムスタンプとdiffファイル名を持つ2つのファイルが到着したら、それらに既存の値を追加し、すべての値をarraylistに格納するために再度操作する必要があります。これらのファイルを並べ替える効率的な方法はありますか? –

答えて

0

これはあなたの探していることを行うはずです。あなたは日付の形式が正しいことを確認する必要があります(私はそれを推測..)といくつかの追加の検証を追加します。申し訳ありませんが、ちょうどあなたがそれらすべてを並べ替えてみたかった気づい

Dim filename As String = "prod_orders_abc_20122001083000.dat" 

    filename = IO.Path.GetFileNameWithoutExtension(filename.Split("_").Last) 

    'yyyyddMMhhmmss 
    '20122001083000 
    Dim fileDate As Date 

    If Date.TryParseExact(filename, "yyyyddMMhhmmss", Globalization.CultureInfo.CurrentCulture, Globalization.DateTimeStyles.None, fileDate) Then 
     Debug.WriteLine(fileDate) 
    Else 
     Debug.WriteLine("unable to get date") 
    End If 

編集、...

Sub main() 

    Dim filenames() As String = 
     {"prod_orders_abc_20122001083000.dat", 
     "prod_orders_abc_20122007083111.dat", 
     "prod_orders_xyz_20122003093157.dat", 
     "prod_orders_xyz_20122001083000.dat", 
     "prod_orders_abc_20122001163139.dat", 
     "prod_orders_abc_20122002093137.dat", 
     "prod_orders_xyz_20122001183000.dat", 
     "prod_orders_abc_20122001163139.dat", 
     "prod_orders_abc_20122001093137.dat"} 


    Dim SortedFileNames As List(Of String) = 
     filenames.OrderBy(Function(fileName) GetDateFromFileName(fileName)).ToList 


End Sub 

Private Function GetDateFromFileName(fileName As String) As Date 

    fileName = IO.Path.GetFileNameWithoutExtension(fileName.Split("_").Last) 

    'yyyyddMMhhmmss 
    '20122001083000 
    Dim fileDate As Date 

    If Date.TryParseExact(fileName, "yyyyddMMhhmmss", Globalization.CultureInfo.CurrentCulture, Globalization.DateTimeStyles.None, fileDate) Then 
     Return fileDate 
    Else 
     Return Date.MinValue 
    End If 

End Function 

エンドモジュール

1

申し訳ありませんが、VBの答えを提供していませんが、それはVB.NETに変換することは難しくありません 次のコードは、タイムスタンプで配列をストートします。

string[] fileNames = 
{ "prod_orders_abc_20122001083000.dat", 
    "prod_orders_abc_20122007083111.dat", 
    "prod_orders_xyz_20122003093157.dat", 
    "prod_orders_xyz_20122001083000.dat", 
    "prod_orders_abc_20122001163139.dat", 
    "prod_orders_abc_20122002093137.dat", 
    "prod_orders_xyz_20122001183000.dat", 
    "prod_orders_abc_20122001163139.dat", 
    "prod_orders_abc_20122001093137.dat" 
}; 

var result = fileNames.OrderBy(s => s.Substring(s.Length - 12,4)).ToArray(); 

更新日: 同じコードのVB版。

Dim fileNames As String() = {"prod_orders_abc_20122001083000.dat", "prod_orders_abc_20122007083111.dat", "prod_orders_xyz_20122003093157.dat", "prod_orders_xyz_20122001083000.dat", "prod_orders_abc_20122001163139.dat", "prod_orders_abc_20122002093137.dat", _ 
    "prod_orders_xyz_20122001183000.dat", "prod_orders_abc_20122001163139.dat", "prod_orders_abc_20122001093137.dat"} 

Dim result = fileNames.OrderBy(Function(s) s.Substring(s.Length - 12, 4)).ToArray() 
関連する問題