在文本文件中搜索精确字符串并在发现失败时执行操作的代码
本文关键字:失败 发现 执行 代码 操作 串并 字符串 文件 文本 搜索 字符 | 更新日期: 2023-09-27 18:03:13
因此,我编写了一些代码,假设读取文本文件,然后检查特定字符串的实例。如果该字符串存在,它将需要执行一个操作。我增加了一些消息框,让我知道这个功能的进度。问题是,找不到合适的词。下面是我的代码:
private void test2_Click(object sender, EventArgs e)
{
StreamReader objReader = new StreamReader("C:''testing''mslogon.log");
string sLine = "";
ArrayList arrText = new ArrayList();
MessageBox.Show("File Read");
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
{
arrText.Add(sLine);
}
}
if (arrText.Contains("Invalid"))
{
MessageBox.Show("Word Invalid Found");
}
else
{
MessageBox.Show("Nada");
}
}
现在,您正在检查arrText中的元素是否正好等于"Invalid"。如果"Invalid"被嵌入到更大的字符串中,它将找不到它。
要检查是否有字符串包含Invalid,您必须执行:
foreach(var line in arrText)
{
if (line.Contains("Invalid")) { MessageBox.Show("Word 'Invalid' Found"); break; }
}
使用文件。@Alexei提到的ReadAllText将使你能够做你想做的事情,看起来像这样:
String wholeFile = File.ReadAllText();
if (wholeFile.Contains("Invalid")) {
MessageBox.Show("Word 'Invalid' Found");
} else {
. . .
try this:
private void test2_Click(object sender, EventArgs e)
{
StreamReader objReader = new StreamReader("C:''testing''mslogon.log");
string sLine = "";
ArrayList arrText = new ArrayList();
MessageBox.Show("File Read");
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
{
arrText.Add(sLine);
}
}
foreach(string x in arrText)
{
if (x.Contains("Word Invalid Found"))
{
MessageBox.Show("Nothing Found");
}
else
{
MessageBox.Show("Nada");
}
}
}
问题是,通过做arrText.Contains("Invalid")
,您正在搜索array
的每个元素的"Invalid",所以除非您在文本文件中有该文本的单行,否则将找不到它。
在构建数组时,需要搜索每一行,并在那里设置flag。
var isFound = false;
var searchPhrase = "Invalid";
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
{
arrText.Add(sLine);
if (sLine.Contains(searchPhrase)) isFound = true;
}
}
if (isFound)
{
MessageBox.Show("Word Invalid Found");
}
else
{
MessageBox.Show("Nada");
}
如果文件不是很大,可以考虑使用file一次性读取所有文本。ReadAllText函数。
而且,默认情况下,搜索是区分大小写的,所以你会错过"word invalid found"
你的代码做了太多的工作。如果您想知道的只是文件中是否包含带有"Invalid"字样的行,那么您不必一次读取整个文件。你可以在你找到的第一行停下来。想想看:
bool found = false;
var lines = File.ReadLines(@"c:'testing'mslogon.log");
foreach (var sLine in lines)
{
if (sLine.IndexOf("Invalid") != -1)
{
found = true;
break;
}
}
if (found)
{
MessageBox.Show("Found it!");
}
else
{
MessageBox.Show("Not found.");
}
并且,您可以用LINQ表达式替换foreach
:
bool found = lines.Where(sLine => sLine.IndexOf("Invalid") != -1).Any();
这里的关键是File.ReadLines
创建了一个枚举器,它允许您一次一行地读取文件,而不是将整个文件加载到内存中。在循环中,如果找到一行,break
会提前终止循环。在LINQ
表达式中,Any
方法基本上做同样的事情。关键是,如果在第一行找到"Invalid",则不需要通读文件的其余部分。
你必须在数组的每一项中搜索,在你的实际代码中,只有一个确切内容为"Invalid"的字符串才能工作。
使用LINQ,你可以这样做:
if (arrText
.ToArray()
.Where(p => ((string)p).Contains("Invalid")).Any())
{
MessageBox.Show("Word Invalid Found");
}