【问题标题】:Find the last occurrence of substring in string in a large text file在大文本文件中查找字符串中最后出现的子字符串
【发布时间】:2015-05-27 14:24:00
【问题描述】:

我正在尝试阅读一个大约 10 GB 的巨大文本文件。 我想找到最后一次出现的字符串。

例如,下面是 5 行的示例,第 2 行和第 5 行是相同的字符串。
我想取最后一个,因为它是最新的,并使用 streamreader 将其输出到文本文件。

我最好使用 Regex 还是使用 lastindexof 来确定它是否是最后一个字符串?

我有很多这样的搜索要做,所以我会创建某种数组并让它自下而上搜索以提高性能。

有人能指出正确的方向吗?

GET/a/users/115656WindowsNT6.1;Trident
GET/a/users/126692MSIE7.0;WindowsNT6.1
GET/a/users/77562WindowsNT6.1;WOW64;Tr
GET/a/users/35650WindowsNT6.1;WOW64;Tr
GET/a/users/126692MSIE7.0;WindowsNT6.2

【问题讨论】:

  • 你说你有 10 gigs 这些数据。我会使用基于 sqlite 的解决方案,将数据读入数据库,然后获得不同的值。我不会在这里使用任何正则表达式,除非您还想从这些字符串中获取特定的模式。由于这些行是相同的,因此仅获取最后一次出现(last = first)是没有意义的。
  • 请参阅bytes.com/topic/net/answers/… 了解可能的解决方案。
  • 实际上,您正在查看向后读取文件并在执行过程中检查行。倒着读还是很困难的。看到这个问题:stackoverflow.com/questions/452902/…
  • 是的..您可以使用基于数据存储的解决方案..它会比使用正则表达式更快更高效..
  • 尝试搜索“文件随机访问”。如果您的记录具有固定的记录长度,那么获取最后 N 条记录并将它们复制到字符串应该很容易。

标签: regex vb.net lastindexof


【解决方案1】:

我相信File.ReadLines是根据msdn读取大文件的最佳方式之一:

ReadLines 和 ReadAllLines 方法的区别如下: ReadLines,可以开始枚举之前的字符串集合 整个集合被退回;当您使用 ReadAllLines 时,您必须 等待返回整个字符串数组,然后才能访问 数组。因此,当您处理非常大的文件时, ReadLines 可以更高效。

因此,基于此,我编写了以下代码,希望对您有所帮助:

Dim myList As List(Of String) = IO.File.ReadLines("MyLargFile.txt").OfType(Of String)().Where(Function(s) s.Contains("126692MSIE7")).ToList

这段代码会返回一个匹配字符串行的列表。

输出:

myList(0) = "GET/a/users/126692MSIE7.0;WindowsNT6.1" 
myList(1) = "GET/a/users/126692MSIE7.0;WindowsNT6.2"

当然,如果需要最后一行,您可以使用Last 方法:

Dim last As String = myList.Last

【讨论】:

    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2012-03-23
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多