[英]Search String Pattern in Large Text Files C#
我一直在尝试在大型文本文件中搜索字符串模式。 我正在逐行阅读并检查每条导致大量时间的行。 我确实尝试了HashSet
和ReadAllLines
。 HashSet<string> strings = new HashSet<string>(File.ReadAllLines(@"D:\\Doc\\Tst.txt"));
现在,当我尝试搜索字符串时,它不匹配。 正在寻找整个行的匹配项。 我只想检查字符串是否出现在行中。
我已经尝试过使用这个:
using (System.IO.StreamReader file = new System.IO.StreamReader(@"D:\Doc\Tst.txt"))
{
while ((CurrentLine = file.ReadLine()) != null)
{
vals = chk_log(CurrentLine, date_Format, (range.Cells[i][counter]).Value2, vals);
if (vals == true)
break;
}
}
bool chk_log(string LineText, string date_to_chk, string publisher, bool tvals)
{
if (LineText.Contains(date_to_chk))
if (LineText.Contains(publisher))
{
tvals = true;
}
else
tvals = false;
else tvals = false;
return tvals;
}
但这会浪费太多时间。 在这方面的任何帮助都是很好的。
读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>
。
您可以使用已编译的正则表达式来代替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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.