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

时间:2016-11-02 01:36:56

标签: c# string search line streamreader

我正在尝试检查大约500 000行的大型文本文档是否包含特定行,问题是我是否以这种方式找到它:

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

所以我得到了“第4行”右边的“行存在”的答案,但是如果我从命令中删除它,并再次检查文件中相同的字符串“第4行”,则表示“行存在”,因为它似乎在文本文件内容中找到了所有4个数字,并且只有当我删除“line47”时,“行不存在”。

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

2 个答案:

答案 0 :(得分:1)

sr.ReadToEnd(); 逐行读取文件,但会读取当前位置到流末尾的所有字符。

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"

答案 1 :(得分:0)

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

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

的更多信息