1

我有一个文本文件:

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和 until得到所有行goal。有很多Somethinggoal在文件中。我应该使用数组或其他东西......?

4

3 回答 3

0

这是元代码

遍历行
    如果行从“某事”开始
        应该追加 = 真
    结尾

    如果行从“目标”开始
        应该追加 = 假
    结尾

    如果应该追加 == 真

        // 将行追加到字符串生成器
        // 或根据需要添加到列表中

    结尾
结尾
于 2013-05-19T21:38:49.757 回答
0

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

    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);
        }
    }

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

于 2013-05-19T21:39:18.440 回答
0

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

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都是对应于单个“Something...goal”对的文本行列表。

于 2013-05-19T22:11:22.400 回答