0

我有一个如下的文本文件(它有几十万行):

Header
AGROUP1
ADATA1|0000
ADATA2|0001
ADATA3|0002
D0000|TNE
D0001|TNE
D0002|TNE
AGROUP2
ADATA1|0000
ADATA2|0001
ADATA3|0002
D0000|TNE
D0001|TNE
D0002|TNE
AGROUP3
ADATA1|0000
ADATA2|0001
ADATA3|0002
D0000|TNE
D0001|TNE
D0002|TNE

事实上,它有超过几十万行代码。

我需要基于组读取数据例如在一个方法中:

public void ReadData(string strGroup)
{
    if(strGroup == "AGROUP2)
       //Read from the text file starting from line  "AGROUP2" to "AGROUP3"(i.e lines under AGROUP2)
}

我试过的是

 public void ReadData(string strGroup)
    {
             bool start = false;
             while ((line = reader.ReadLine()) != null)
                    {
                        if (line == strGroup && line.Length == 5)
                            start = true;
                        else if (line.Length == 5)
                            start = false;
                        if(start)
                            yield return line;
                    }
    }

它工作正常,性能方面,它需要更长的时间,因为我的文本文件是一个非常非常大的文件......方法中的每一行都有 if 条件。

这是更好的方法吗?

4

2 回答 2

1

如果您对文件结构有任何了解,可以帮助您使用它:

  • 如果列表已排序,您可能知道何时停止解析。
  • 如果列表包含跳转表或索引,您可以跳过行
  • 如果这些组有特定数量的行,您可以跳过这些

如果没有,你注定要从上到下搜索,你将只能使用技术技巧来提高速度:

  • 读取成批的行而不是单行
  • 尽量避免在代码中创建许多可能阻塞垃圾收集器的微小对象(字符串)
  • 如果您需要进行大量随机访问(在整个文件中来回访问),您可能会考虑先索引或拆分文件。
于 2012-10-02T07:55:05.967 回答
0

如果您使用 bash 命令将大文件切割成更小的文件,并以 AGROUP# 作为第一行。我认为 bash 命令更加优化。

于 2012-10-02T04:56:34.590 回答