我的文本文件是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)
答案 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
查询看起来很长,您可以将其自上而下,以便您可以更轻松地阅读。