我一直在尝试在大型文本文件中搜索字符串模式。我正在逐行阅读并检查导致大量时间的每一行。我尝试过使用 <?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 –>
和HashSet
。
ReadAllLines
现在,当我尝试搜索字符串时,它不匹配。因为它正在寻找整行的匹配。我只想检查字符串是否出现在行中。
我曾尝试使用此功能:
HashSet<string> strings = new HashSet<string>(File.ReadAllLines(@"D:\Doc\Tst.txt"));
但这耗费了太多时间。对此的任何帮助都会很好。
答案 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);