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 に答える