【问题标题】:What lines have not been read? Streamreader哪些行没有被读取?流式阅读器
【发布时间】:2014-03-10 16:20:43
【问题描述】:

我正在为复杂格式开发文件阅读器。实际上有数百个不同的条目。在我现在这样做的方式中,我需要使用两个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

有什么建议或更好的方法吗?

【问题讨论】:

  • 在每次通读时跟踪行号并在不满足任何条件时将行号添加到集合中有什么问题?

标签: c# streamreader


【解决方案1】:

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

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 = ...
        }
    }
}

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

【讨论】:

    【解决方案2】:

    有很多字符串搜索算法。他们中的大多数使用散列和 Windowing Algorithm,你可以从 What is Sliding Window Algorithm? Examples?

    得到一个想法

    每种算法在一般复杂性或最坏情况等方面略有不同。您可以选择最适合您的应用程序的一种:

    Rabin–Karp algorithm

    Aho–Corasick string matching algorithm

    Knuth–Morris–Pratt algorithm

    Boyer–Moore string search algorithm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-15
      • 2010-10-24
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多