FileSort в Visual Basic на основе TimeStamp, упомянутых в именах файлов - PullRequest
0 голосов
/ 27 января 2012

как отсортировать файлы в каталоге по части имени файла?

Формат файла:
prod_orders_XXX_<TimeStamp>.datXXX = symbol of the product and the length may varies.<br> <TimeStamp> = date and time

Возможно несколько файлов для одного и того же XXX сразные отметки времени.

Вот несколько примеров:

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 

Мне нужно отсортировать файлы по отметке времени, указанной в имени файла.

Ответы [ 2 ]

1 голос
/ 27 января 2012

Извините, что не предоставил ответ 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()
0 голосов
/ 27 января 2012

Это должно сделать то, что вы ищете. Вам нужно убедиться, что формат даты правильный (как я уже догадался) и добавить дополнительную проверку.

    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

Конечный модуль

...