【问题标题】:Search a text file for a word then print the lines where it exists [duplicate]在文本文件中搜索一个单词,然后打印它存在的行[重复]
【发布时间】:2018-06-20 09:55:49
【问题描述】:

我希望在文本文件中搜索特定关键字,比如 companyName。

程序将搜索单词,然后打印该单词所在的行,然后它也会打印该行下面的行。它应该对单词所在的每一行执行此操作。 I.E 打印所有具有 companyName 的行及其下方的行。 (理想情况下,这将被写入 .txt 文件)

--->程序打印

公司名称:乐购

地址:31, stern street(紧随其后的那条线)

--编辑--

这是我现在工作的代码,供其他人使用:

static void Main(string[] args)
    {
        var sb = new StringBuilder();
        var lines = File.ReadAllLines(@"C:\file.txt");
        for (int i=0; i<lines.Length; i++)
        {
            var line = lines[i];
            if (line.IndexOf("companyName", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                var nextLine = lines[i + 1];
                sb.AppendLine(line);
                sb.AppendLine(nextLine);
            }
        }

        File.WriteAllText(@"C:\out.txt", sb.ToString());

}

【问题讨论】:

  • 您是否有一些代码可以向我们展示您已经尝试过。这将帮助我们为您提供指导。
  • 这是非常基本的东西。尝试搜索您需要的内容并对其进行编码。
  • 如果连续两行包含该单词,您是否应该在第二行之后也显示下一行?
  • 谢谢大家。我没有注意到重复的,抱歉!我将如何接受最佳答案?

标签: c#


【解决方案1】:

您可以尝试以下方法,其中变量 filePath 包含您的文件的路径,而 keyWord 包含您正在寻找的字符串:

        var keyWord = "companyName";
        var hasKeyword = false;
        foreach (var line in System.IO.File.ReadAllLines(filePath))
        {
            if (line.Contains(keyWord))
            {
                Console.WriteLine(line);
                hasKeyword = true;
                continue;
            }
            if (hasKeyword)
            {
                Console.WriteLine(line);
                hasKeyword = false;
            }
        } 

【讨论】:

  • 你不需要添加一个继续;在此代码工作的第一个条件中。
  • 是的,你是对的,谢谢 :)
【解决方案2】:

也许是这样的?

using (var sr = new StreamReader(inFile))
   using (var sw = new StreamWriter(OutFile))
      while (!sr.EndOfStream)
      {
          var line1 = sr.ReadLine();
          if (line1.IndexOf(SearchString, StringComparison.OrdinalIgnoreCase) >= 0)
             continue;

          sw.WriteLine(line1);
          sw.WriteLine(sr.ReadLine());
      }

免责声明:未经测试,没有错误检查,我不对您使用此代码造成的伤害和伤害的人员负责

【讨论】:

  • 是的,为什么不呢。
  • 因为File.ReadAllLines(…) 或File.ReadLines(…) 如果你不想一次读完它们
  • @stuartd 如果它是 5 gig 文件怎么办 :)
  • 这是一个不常见的情况,但有道理。 docs for ReadLines是这么说的——“当你使用ReadLines时,你可以在返回整个集合之前开始枚举字符串的集合;当你使用ReadAllLines时,你必须等待整个字符串数组都被返回之后才可以访问数组。因此,当您处理非常大的文件时,ReadLines 会更高效。" -
  • @stuartd 谢谢你,说实话,我刚刚在屏幕上看到另一个问题的代码。尽管它确实可以与阅读和写作的和平用餐方式巧妙地配合使用。此外,如果您想看中速度,您可以调整缓冲区大小,以及用于性能和其他恶作剧的高级文件选项。显然与 OPS 问题无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多