什么线还没看过? StreamReader的

时间:2014-03-10 06:53:18

标签: c# streamreader

我正在为复杂的格式开发文件阅读器。实际上有数百种不同的条目。在我现在这样做的方式中,我需要使用两个Streamreaders,因为我之前需要提取一些信息。这些文件足够大,不能一次读取它们。

我想要的是通知用户哪些行未被读取。我的结构是这样的:

Streamreader file1 = new Streamreader(path);
while((line=file1.Readline()) != null)
{
     if(line.StartsWith("HELLO")
{
//...
}
//... more conditions
}



Streamreader file2 = new Streamreader(path);
while((line=file2.Readline()) != null)
{
     if(line.StartsWith("GOOD MORNING")
{
//...
}
//...more conditions 
}

因此,如果我的读者在最后完美阅读所有行。事情可能很奇怪,有些条目还没有实现,我想抓住那条线。如您所见,此处的问题是两个 StreamReaders

我的选择是:

  1. 在数组中存储所有不读取的行,然后将其用于第二次读取,读取后逐行减去。不好,因为我将存储数千行。
  2. 将第二个StreamReader中的所有条件添加到第一个(全部添加),这样我就会知道第二次读取哪些行。比以前好,但我需要在几个地方修改我的代码,以使其正常运行。我的意思是,当我想要实现阅读新条目(第二StreamReader)时,我还需要修改第一个StreamReader
  3. 有任何建议或更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我会创建一些谓词函数翻译行,即:

class PredicateResult{
    public En_LineType type;
    public String data;
}

private PredicateResult FirstReader(String line){
    if(line.StartsWith("HELLO")){
        return new PredicateResult{
            type = En_LineType.Hello,
            data = ...
        }
    }
}

这样,您有两个函数可用于检查行是否与其中任何一行匹配。另外,您可以轻松更改匹配行的条件,并且可以支持不同的格式。

答案 1 :(得分:0)

有许多字符串搜索算法。他们中的大多数使用散列与窗口算法,您可以从What is Sliding Window Algorithm? Examples?获得一个想法

每种算法在一般复杂性或最坏情况等方面都有细微差别。您可以选择一个最适合您应用的算法:

Rabin–Karp algorithm

Aho–Corasick string matching algorithm

Knuth–Morris–Pratt algorithm

Boyer–Moore string search algorithm