在文本文件中搜索精确字符串并在发现失败时执行操作的代码

本文关键字:失败 发现 执行 代码 操作 串并 字符串 文件 文本 搜索 字符 | 更新日期: 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");
    }