使用分隔符

时间:2015-08-13 18:28:03

标签: vb.net

我的文本文件是800KB一行一行的逗号分隔符。 我试图通过作为日期的第一部分对该文本文件进行排序。 当我运行它时,大约需要2秒钟才能完成。 事情真的在减慢它,你们看到了什么?

    Dim sw As New Stopwatch
    sw.Start()
    Dim sMilli As Integer = 1000
    Dim iSortedDates As New SortedDictionary(Of Date, String)
    For Each line As String In IO.File.ReadAllLines(iFilePath)
        Dim eachPart() As String = line.Split(","c)
        Dim eachDate As Date = Date.Parse(eachPart(0)).AddMilliseconds(sMilli)
        iSortedDates(eachDate) = line
        If sMilli = 5000 Then sMilli = 1
        sMilli += 1
    Next
    Dim iAllData As String = ""
    For Each iSNew In iSortedDates.Keys
        iAllData += iSortedDates(iSNew) & Environment.NewLine
    Next
    IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory & iFilePath, iAllData)
    sw.Stop()
    Debug.Print("Total Milliseconds: " & sw.Elapsed.TotalMilliseconds)

2 个答案:

答案 0 :(得分:1)

如果您定位的是版本4或更高版本的框架,您可以使用IO.File.ReadLines代替IO.File.ReadAllLines来节省一些时间,因为ReadLines不会让您等到在开始处理行之前,将读取整个文件。

您可以使用iAllData创建一个可以编写为bi iSortedDates.Values的数组,从而避免一次构建长IO.File.WriteAllLines个字符串。

Dim sw As New Stopwatch
sw.Start()
Dim sMilli As Integer = 1000
Dim iSortedDates As New SortedDictionary(Of Date, String)
For Each line As String In IO.File.ReadLines(iFilePath)
    Dim eachPart() As String = line.Split(","c)
    Dim eachDate As Date = Date.Parse(eachPart(0)).AddMilliseconds(sMilli)
    iSortedDates(eachDate) = line
    If sMilli = 5000 Then sMilli = 1
    sMilli += 1
Next
Dim iAllData() As String = iSortedDates.Values.ToArray 
IO.File.WriteAllLines(AppDomain.CurrentDomain.BaseDirectory & iFilePath, iAllData)
sw.Stop()
Debug.Print("Total Milliseconds: " & sw.Elapsed.TotalMilliseconds)

答案 1 :(得分:1)

如果可以,我会调查public Action<DataItem> Convert(Action<DomItem> action) { return new Action<DataItem>(o => action(Map(o))); } public DomItem Map(DataItem dataItem) { return new DomItem{Name = dataItem.Name}; } 。下面是我为你做的一个快速查询,它不仅读取所有行,而且检查拆分字符串是否为日期然后按顺序排序,并将其他任何内容排序。我在 6.73 MB 文件上对此进行了测试,并以 1.97 秒出现。如果你问我这么快我会说。

您可以在任何地方使用

Linq

返回字符串中所有行的函数

  Dim nDate As Date
  Dim lines As List(Of String) = System.IO.File.ReadAllLines(yourfile).Where(Function(x) Date.TryParse(x.Split(","c)(0), nDate) OrElse Not String.IsNullOrEmpty(x)).OrderBy(Function(line) line.Split(",")(0)).ToList

  IO.File.WriteAllText("FILE LOCATION", Concat(lines))

P.S。很抱歉,如果Public Shared Function Concat(source As List(Of String)) As String Dim sb As New System.Text.StringBuilder For Each s As String In source sb.AppendLine(s) Next Return sb.ToString() End Function 查询看起来很长,您可以将其自上而下,以便您可以更轻松地阅读。