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

C# 在大型文本文件C中搜索字符串模式#,c#,string,C#,String,我一直在尝试在一个大的文本文件中搜索字符串模式。我一行一行地阅读,检查每一行,这会占用很多时间。我尝试了HashSet和ReadAllLines。 HashSet strings=新的HashSet(File.ReadAllLines(@“D:\Doc\Tst.txt”) 现在,当我尝试搜索字符串时,它不匹配。因为它正在寻找整行的匹配项。我只想检查字符串是否出现在行中 我试过使用这个: using (System.IO.StreamReader file = new System.IO.Stre

我一直在尝试在一个大的文本文件中搜索字符串模式。我一行一行地阅读,检查每一行,这会占用很多时间。我尝试了
HashSet
ReadAllLines
HashSet strings=新的HashSet(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;

        }

但这太耗费时间了。这方面的任何帮助都是很好的。

阅读
散列集对我来说没有意义(除非有很多重复的行),因为您没有测试该集的成员资格

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

var isItThere = File.ReadAllLines(@"d:\docs\st.txt").Any(x => 
    x.Contains(date_to_chk) && x.Contains(publisher));
65K行(比如说)1K行没有太多的内存需要担心,我个人也不会为并行而烦恼,因为这听起来无论如何都是超快的


您可以替换
Any
where
First
以查找第一个结果,或者替换
where
以获得包含所有结果的
IEnumerable

读取
哈希集对我来说没有意义(除非有许多重复行),因为您没有测试该集的成员资格

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

var isItThere = File.ReadAllLines(@"d:\docs\st.txt").Any(x => 
    x.Contains(date_to_chk) && x.Contains(publisher));
65K行(比如说)1K行没有太多的内存需要担心,我个人也不会为并行而烦恼,因为这听起来无论如何都是超快的


您可以替换
Any
where
First
以查找第一个结果,或者替换
where
以获得包含所有结果的
IEnumerable

您可以使用编译后的正则表达式而不是
字符串。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);

您可以使用已编译的正则表达式而不是
字符串。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);

您是否只需要检查文件中是否存在所需的模式?您可以使用并行来提高多核CPU的速度是的,我必须在一行中查找两种模式。但是这个文件很大,我必须搜索其他模式。行数是多少?什么是
(range.Cells[i][counter])。值2
?(range.Cells[i][counter])。值2这是一个字符串。行数大约为65000行首先定义“太多”是多少,或者换句话说,您希望达到的性能。然后使用探查器找出所花时间的确切位置(例如,
(range.Cells[i][counter])。Value2
实际上在做什么,例如,您只能做一次(因为表达式不受“当前行”的影响)。您是否只需要这样做来检查文件中的某个地方是否存在所需的模式?您可以使用并行来提高多核CPU的速度是的,我必须在一行中查找两种模式。但是这个文件很大,我必须搜索其他模式。行数是多少?什么是
(range.Cells[i][counter])。值2
?(range.Cells[i][counter])。值2这是一个字符串。行数大约为65000行首先定义“太多”是多少,或者换句话说,您希望达到的性能。然后使用探查器找出所花时间的确切位置(例如,
(range.Cells[i][counter])。Value2
实际上在做什么,例如,您只能做一次(因为表达式不受“当前行”的影响)。您的代码中缺少括号。
Any
one未关闭。@Nefrin应该是
&&x.Contains(publisher))@Jeff,谢谢你的解决方案。它就像一个符咒。你的代码中缺少了一个括号。
Any
one未关闭。@Nefrin应该是
&&x.Contains(publisher))@Jeff,谢谢你的解决方案。它就像一个符咒。