0

パイプで区切られた医療記録でいっぱいのテキストファイルを読み込もうとしています。約20列のデータと数百万行があります。テキストファイルのサイズは約1GBです。

最初のステップはデータの読み取りです。これが私のコードです:

private void button1_Click(object sender, EventArgs e)
    {
        string strFilePath = @"abcrecords.txt";
        string[,] myArray;

        using (FileStream fs = new FileStream(strFilePath, FileMode.Open))
        using (StreamReader rdr = new StreamReader(fs))
        {
            while (!rdr.EndOfStream)
            {
                string[] strFileLine = rdr.ReadLine().Split('|');
                {
                    myArray = strFileLine;
                }
            }
        }
    }

分割線(20個の要素がある)の結果をの最初の行に取得するにはどうすればよいですかmyArraymyArray次に、新しい分割線をそれぞれ?に追加します。今、私はエラーを受け取ります:

エラータイプ'string[]'を'string[ ]'に暗黙的に変換できません

4

3 に答える 3

1

List<string[]>変更する場合は、代わりに配列を使用してください。配列は不変です。(imho)File.ReadLinesとしてより快適なものを使用することもできます:StreamReader

List<string[]> allLines = File.ReadLines(path)
    .Select(l => l.Split('|').ToArray())
    .ToList();

上記は、を追加する必要があるLinqクエリであることに注意してくださいusing System.Linq

私のアプローチのメモリ消費についての最後のメモ。一度にすべてをメモリに読み込むのとは異なり、一度に1行を読み取る内部をFile.ReadLines使用しますが、このアプローチをさらに改善することもできます。StreamReaderFile.ReadAllLines

関連する私自身の質問を見てください:Enumerable.Rangeでの高メモリ消費?

したがって、最初に行数を読み取って、リストを正しいサイズで初期化できます。

int count = File.ReadLines(path).Count();
var allLines = new List<string[]>(count);
var lines = File.ReadLines(path).Select(l => l.Split('|').ToArray());
allLines.AddRange(lines);

そうしないと、からのサイズアルゴリズムが2倍になるため、必要なメモリよりもほぼ100%多くのメモリを必要とするリストで終了する可能性がありますList.Add

ただし、代わりにデータベースの使用を検討する必要があります。

于 2013-01-11T17:21:10.030 に答える
1

これを試して:

        File.ReadAllLines("abcrecords.txt").Select(x => x.Split('|')).ToArray();

アップデート

ファイルが大きいため、次のものを使用できます。

        var result = new List<string[]>();
        using (FileStream fs = new FileStream(strFilePath, FileMode.Open))
        using (StreamReader rdr = new StreamReader(fs))
        {
            while (!rdr.EndOfStream)
            {
                result.Add(rdr.ReadLine().Split('|')))
            }
        }

しかし、そのような大きなオブジェクトをメモリに格納するのは非常にコストがかかります。

于 2013-01-11T17:21:41.740 に答える
0

アレクサンダーバルテのスタートを借りた。

using (FileStream fs = new FileStream("", FileMode.Open))
{
  using (StreamReader rdr = new StreamReader(fs))
  {
    while (!rdr.EndOfStream)
    {
      DoSomethingWith(rdr.ReadLine().Split('|')));
    }
  }
}
void DoSomethingWith(String[] argColumns)
{
  // on y va
}
于 2013-01-11T17:49:36.773 に答える