如何在大型文本文档中找到具有唯一字符串内容的特定行

本文关键字:字符串 唯一 大型 文本 文档 | 更新日期: 2023-09-27 18:15:56

我试图检查是否大型文本文档约50万行包含特定行,问题是,如果我发现它是这样的:

string searchLine = "line 4";
using (StreamReader sr = new StreamReader(filePath)) 
{
   string contents = sr.ReadToEnd();
   if (contents.Contains(searchLine))
   {
      Console.WriteLine("line exist");
   }
   else
   {
      Console.WriteLine("line does not exist");
   }
}

和文档内容是,我不接受写入重复到它,所有字符串都是唯一的:

line 1
line 2
line 3
line 4
line 5
line 47

所以我得到的答案是"line exist"对于"line4"正确,但是如果我从顺序中删除它,并再次检查文件中相同的字符串"line4",它说"line exist",因为它似乎在文本文件内容中找到了所有4个数字,只有当我删除"line47",然后"line不存在"。

所以我想知道如何在大文本文档中找到具有唯一字符串内容的特定行。

如何在大型文本文档中找到具有唯一字符串内容的特定行

sr.ReadToEnd(); not逐行读取文件,而是读取从当前位置到流结束的所有字符。

Readline()方法从当前流中读取一行字符并以字符串

形式返回数据

Readline()方法将逐行读取文件,如下所示:

string currentLine;
bool exist = false;
using (StreamReader sr = new StreamReader(filepath))
{
    while ((currentLine = sr.ReadLine()) != null)
    {
        if (currentLine == "line 4")
            exist = true;                       
    }
 }
 Console.WriteLine(exist ? "line exist" : "line does not exist");

或者你也可以比较:

string.Equals(currentLine, "line 4")
不是

currentLine == "line 4"

您可以使用下面的代码来搜索确切的内容。

public string ExactReplace(string input, string find, string replace)
{
    string textToFind = string.Format(@"'b{0}'b", find);
    return Regex.Replace(input, textToFind, replace);
}

然后你可以把它命名为

string fulltext = sr.ReadToEnd();
string result = text.ExactReplace(fulltext, "line 4", "");

元字符'b是一个锚,类似于插入符号和美元符号。它在一个称为"词边界"的位置匹配。此匹配为零长度。

有三种不同的位置可以作为词边界:

  • 如果第一个字符是a,则在字符串的第一个字符之前单词字符。
  • 如果最后一个字符是单词字符,则在字符串的最后一个字符之后。
  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

有关Word Boundaries的更多信息