【问题标题】:FileSort in visual basic based TimeStamp mentioned in the file names文件名中提到的基于 Visual Basic 时间戳的 FileSort
【发布时间】:2012-02-20 10:19:37
【问题描述】:

如何根据文件名的部分对目录中的文件进行排序?

文件格式:
prod_orders_XXX_<TimeStamp>.datXXX = symbol of the product and the length may varies.
<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 

我需要根据文件名中提到的时间戳对文件进行排序。

【问题讨论】:

  • 我通过将时间戳作为键和文件名(prod_orders_xyz)作为值来尝试 Hashtable,然后通过将它们分配到 arraylist 来对 hashkey 进行排序。但是当两个具有相同时间戳和不同文件名的文件到达时,我需要将它们附加到现有值并再次对其进行操作以将所有值存储到 arraylist 中。有没有有效的方法来对这些文件进行排序?

标签: vb.net sorting filesort


【解决方案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()

【讨论】:

    【解决方案2】:

    这应该可以满足您的需求。您需要确保日期格式正确(我猜对了..)并添加一些额外的验证。

        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
    

    结束模块

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多