在大文本文件中搜索字符串模式C#

时间:2018-03-09 12:29:03

标签: c# string

我一直在尝试在大型文本文件中搜索字符串模式。我正在逐行阅读并检查导致大量时间的每一行。我尝试过使用 <?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd”> <suite name=”Suite”> <test name=”Test”> <classes> <class name=”pack1.ClassA”/> <class name=”pack1.ClassB”/> <class name=”pack1.Init”/> </classes> </test> <!– Test –> </suite> <!– Suite –> HashSetReadAllLines

现在,当我尝试搜索字符串时,它不匹配。因为它正在寻找整行的匹配。我只想检查字符串是否出现在行中。

我曾尝试使用此功能:

HashSet<string> strings = new HashSet<string>(File.ReadAllLines(@"D:\Doc\Tst.txt"));

但这耗费了太多时间。对此的任何帮助都会很好。

2 个答案:

答案 0 :(得分:2)

读入HashSet对我来说没有意义(除非有很多重复的行),因为你没有测试该集合的成员资格。

采取一种非常天真的方法,你可以这样做。

var isItThere = File.ReadAllLines(@"d:\docs\st.txt").Any(x => 
    x.Contains(date_to_chk) && x.Contains(publisher));

65K行(比如说)1K一行并不需要担心很多内存,我个人也不会打扰Parallel,因为听起来反正它是超级快的。

您可以将Any替换为First以查找第一个结果,或Where替换IEnumerable<string>以包含所有结果。

答案 1 :(得分:1)

您可以使用已编译的正则表达式而不是String.Contains(在循环遍历行之前编译一次)。这通常会带来更好的性能。

var regex = new Regex($"{date}|{publisher}", RegexOptions.Compiled);

foreach (string line in File.ReadLines(@"D:\Doc\Tst.txt"))
{
    if (regex.IsMatch(line)) break;
}

这也显示了一个方便的标准库函数,用于逐行读取文件。

或者,取决于你想做什么......

var isItThere = File.ReadLines(@"D:\Doc\Tst.txt").Any(regex.IsMatch);