【问题标题】:read a specific line from a file从文件中读取特定行
【发布时间】:2012-12-30 06:49:41
【问题描述】:

我正在尝试获取包含特定单词的行之前的行列表。这是我的脚本:

private static void Main(string[] args)
{
    int counter = 0;
    string line;

    System.IO.StreamReader file = new System.IO.StreamReader("E:\\overview2.srt");
    List<string> lines = new List<string>();
    while ((line = file.ReadLine()) != null)
    {
        if (line.Contains("medication"))
        {


            int x = counter - 1;
            Console.WriteLine(x); // this will write the line number not its contents

        }

        counter++;
    }

    file.Close();
}

【问题讨论】:

  • 找到单词后你要保留多少行
  • 看起来像一个家庭作业问题,提示行列表已声明但未使用,因此您只需要弄清楚如何向列表中添加一些内容,然后引用较早出现的内容。
  • 如果行包含寻找文件结尾并退出循环,否则写行

标签: c# asp.net readline


【解决方案1】:

使用 LINQ 方法语法:

var lines = File.ReadLines("E:\\overview2.srt")
        .Where(line => line.Contains("medication"))
        .ToList();

和 LINQ 关键字语法:

var lines = (
    from line in File.ReadLines("E:\\overview2.srt")
    where line.Contains("medication")
    select line
).ToList();

如果您需要一个数组,请使用.ToArray() 而不是.ToList()

另外,如果您只需要遍历线路一次,请不要打扰 ToArrayToList

var query = 
    from line in File.ReadLines("E:\\overview2.srt")
    where line.Contains("medication")
    select line;
foreach (var line in query) {
    Console.WriteLine(line);
}

【讨论】:

    【解决方案2】:

    此代码将在包含您的搜索文本的任何行之前显示所有行。

        private static void Main(string[] args)
        {
            string cacheline = "";
            string line;
    
            System.IO.StreamReader file = new System.IO.StreamReader("C:\\overview2.srt");
            List<string> lines = new List<string>();
            while ((line = file.ReadLine()) != null)
            {
                if (line.Contains("medication"))
                {
                    lines.Add(cacheline);
                }
                cacheline = line;
            }
            file.Close();
    
            foreach (var l in lines)
            {
                Console.WriteLine(l);           
            }
        }
    

    很难从您的问题中看出您要在找到的行之前查找所有行还是仅查找一行。 (您必须处理在第一行找到搜索文本的特殊情况。

    【讨论】:

    • 我需要写一个所有行内容(文本)的列表,而不是行号。例如,如果第 6 行包含“药物”一词,我需要获取第 5 行的文本。谢谢
    • 这段代码应该做到这一点。前一行在每次循环时被缓存。如果在下一行找到“药物”,则可以将其保存到列表中。
    • 效果很好,除了只显示一行,有15行包含指定的单词“药物”。谢谢
    • 我在发布之前对其进行了测试。您能否确认在“包含()”中找到了“药物”?
    • 你说得对,我有一个断点才能看到控制台窗口。太感谢了。现在我需要弄清楚如何将行列表作为一个数组。
    【解决方案3】:

    您可以创建一个Queue&lt;string&gt;。当您通过它时,将每一行添加到它。如果它的行数超过了所需的行数,则将第一个项目出列。当您点击所需的搜索表达式时,Queue&lt;string&gt; 包含您需要输出的所有行。

    或者如果内存不是对象,您可以使用File.ReadAllLines(参见http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx)并索引到一个数组中。

    【讨论】:

      【解决方案4】:

      试试这个:

       int linenum = 0;
                      foreach (var line in File.ReadAllLines("Your Address"))
                      {
                          if (line.Contains("medication"))
                          {
                              Console.WriteLine(string.Format("line Number:{} Text:{}"linenum,line)
      //Add to your list or ...
                          }
                          linenum++;
                      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多