繁体   English   中英

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

[英]Search String Pattern in Large Text Files C#

我一直在尝试在大型文本文件中搜索字符串模式。 我正在逐行阅读并检查每条导致大量时间的行。 我确实尝试了HashSetReadAllLines 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM