我正在尝试检查大约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”时,“行不存在”。
所以我想知道如何在大型文本文档中找到具有唯一字符串内容的特定行。
答案 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
是一个像插入符号和美元符号的锚点。它匹配一个称为“单词边界”的位置。这个匹配是零长度。
有三种不同的职位符合词边界: