最初のパスを高速に実行して、各行のオフセットを保存できます。これにより、その後の行の検索がはるかに高速になります。列数が 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 ライブラリにはそのための適切なロジックがあると思います。