0

一度に値を取得し、それをグリッドに動的にロードしています。

特定の行と列の値のみを検索するようにcsvファイルにインデックスを付ける方法はありますか?動的にロードする目的が損なわれるため、すべての行を読み取ることはできません。

CSVパーサー(私の場合は高速CSVパーサー)は、そのような値を取得できますcsv[row][column]。ソースを見ると、正しいインデックス列のペアに到達するまで、ファイル内のすべてをループしていることに気付きました。行100,000列80の値を取得するには、かなり長い時間がかかる場合があります。

どんな助けでも大歓迎です。

4

3 に答える 3

0

CSV ファイルは、特定の行が存在する可能性のあるインデックス作成をサポートしていません。

あなたができる最善の方法は、必要な行が見つかるまで各行を読むことです. そのため、行をスキャンするときに平均してファイルの半分を読み取ることになります。これは、ファイル全体を読み取るよりも優れています。

記事Reading and Writing CSV Files in C#で紹介した CSV パーサーを使用すると、一度に 1 行ずつ読み取ることができます。

もう 1 つのオプションは、同じファイルから複数の行にアクセスする場合です。この場合、ファイルを実行してインデックスのリストを作成できます。ただし、これは、1 つのセッションで複数の行を検索する場合にのみ有効です。

于 2012-12-04T18:55:38.130 に答える
0

最初のパスを高速に実行して、各行のオフセットを保存できます。これにより、その後の行の検索がはるかに高速になります。列数が 80 で行数が 100,000 の場合、高速な列検索ではなく、高速な行検索に重点を置きます。

ETA: わかりました。あなたの CSV ファイルはディスク上にあり、排他的にアクセスできると思います。このコードの一部は、これに基づいています

   List<int> offsets = new List<int>();
   using (StreamReader reader = new StreamReader("myfile.csv"))
   {
        int offset = 0;
        string line;
        while ((line = reader.ReadLine()) != null)
        {   
            offsets.Add(offset);             
            offset += (line.Length + 2);   // The 2 is for NewLine(\r\n)
        }
        offsets.Add(offset);  // pick up the last one
    }

この最後に、offsets行番号で索引付けされ、各行へのオフセットを含む List 変数があります。次に、ファイルを読み取るとき(グリッド構築を行うとき)offsets[n]にオフセットを取得Seekし(FileStreamまたはStreamReaderを使用していると仮定しています)offsets[n+1] - offsets[n]、長さを取得できます。

返されたテキスト行の解析に関する限り、適応している CSV ライブラリにはそのための適切なロジックがあると思います。

于 2012-12-04T18:55:49.737 に答える
0

サードパーティのライブラリの使用が許可されている場合は、それらのいくつかを調べます。MySQL には CSV エンジンがサポートされているため、MySQL のライブラリを使用してこれを行うことができるようです。

ただし、C# は CSV ファイルを処理する優れた方法を提供していません。

http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html

于 2012-12-04T20:28:16.677 に答える