【问题标题】:How to get several lines from a text file? [closed]如何从文本文件中获取几行? [关闭]
【发布时间】:2013-05-19 21:30:01
【问题描述】:

我有一个文本文件:

hh
    Something sdf....
    one line 
    empty line
    other line
    goal 

    Something apf ee
    one line 
    goal 

List<String> goo = new List<String>();

System.IO.StreamReader file = new System.IO.StreamReader("text.txt");
while (file.EndOfStream != true)
{
    string s = file.ReadLine();
    if (s.Contains("Something"))
    {            
        goo.Add(s);
    }
}

我想获取Something 之后和goal 之前的所有行。 文件中有很多Somethinggoal。我应该使用数组或其他东西...?

【问题讨论】:

标签: c# string file text


【解决方案1】:

我将提供一个 LINQ 风格的解决方案。首先,一个简单的辅助扩展方法,用于从IEnumerable&lt;T&gt; 中挑选子范围:

public static class EnumerableHelper
{
    public static IEnumerable<List<T>> GetWindows<T>(
        this IEnumerable<T> source,
        Func<T, bool> begin,
        Func<T, bool> end)
    {
        List<T> window = null;
        foreach (var item in source)
        {
            if (window == null && begin(item))
            {
                window = new List<T>();
            }
            if (window != null)
            {
                window.Add(item);
            }
            if (window != null && end(item))
            {
                yield return window;
                window = null;
            }
        }
    }
};

现在您可以像这样获得您感兴趣的文本窗口:

List<List<string>> windows = File.ReadLines("file.txt")
    .GetWindows(
        line => line.Contains("Something"),
        line => line.Contains("goal"))
    .ToList();

windows 中的每个项目都是对应于单个“某事...目标”对的文本行列表。

【讨论】:

  • 抱歉这个愚蠢的问题,但我应该添加参考还是什么?
  • @John 我已经稍微改进了答案,明确说明了如何声明包含扩展方法GetWindows 的静态类。除了默认为您添加的那些之外,您不需要任何引用或 using ... 语句(如果您使用的是 Visual Studio 项目) - System.Collections.GenericSystem.Linq 等。
  • System.Collections.Generic.IEnumerable 不包含“GetWindows”的定义,也没有扩展方法“GetWindows”...我使用的是 Visual Studio Espress 2012。
  • @John 你需要在你的项目中包含 EnumerableHelper 类。
【解决方案2】:

这是元代码

遍历行 如果行从“某事”开始 应该追加 = 真 结尾 如果行从“目标”开始 应该追加 = 假 结尾 如果应该追加 == 真 // 将行追加到字符串生成器 // 或根据需要添加到列表中 结尾 结尾

【讨论】:

    【解决方案3】:

    只需跟踪状态读数。据我所知,你有两种状态。当你想添加线,当你不想。如果您跟踪状态,那么您只需在添加时检查状态。一个简单但不是最好的方法,因为它不是很健壮,这样做的方法是这样的:

        while (file.EndOfStream != true)
        {   
            bool addStuff = false;
            string s = file.ReadLine();
            if (s.Contains("Something"))
            {   
               addStuff = true;
            }else if (s.Contains("goal")){
               addStuff = false
            }
    
            if(addStuff){
                goo.Add(s);
            }
        }
    

    警告这并不可靠,因为它不会处理无效格式之类的事情。这旨在为您提供如何解决此问题的指南。

    【讨论】:

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