スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] A Fast CSV Reader が速い!

C#で、CSVファイルの読込みを自作で処理していました。
完成度が高くないのでコードは書きませんが、簡易に、
1. StreamReaderで読込み
2. ReadLineにて行を読込み
3. split(',')にて値を取り出し
4.Listに格納
してました。

しかし、もっと早くできないものかな?
と考え、ちょっと調べてみたら、A Fast CSV Readerというものを発見。

そこで、A Fast CSV Readerを使ってベンチマークしてみました。
ただし、A Fast CSV Readerを取得するには、登録が必要です。
ベンチマークは以下のスペックです。
CPU : Core i7 950 3.07 GHz 
Mem : 6 GB
OS    : Windows7 64bit
CSV  :  col 4 , row 6200000


やっていることは、全ての値をList<List<string>>に格納しています。


LibTime [msec]
現状30237
A Fast CSV Reader9077


なんと、1/3程度に、短縮しています。
これは凄い。(自前がどんだけしょぼかったのかorz)

ちなみに、A Fast CSV Readerを使ったコードはこれ。

List<List<string>> lobj = new List<List<string>>();

using (LumenWorks.Framework.IO.Csv.CsvReader rcsv =
new LumenWorks.Framework.IO.Csv.CsvReader(new StreamReader(csvpath), true)) {

rcsv.SupportsMultiline = false;

while (rcsv.ReadNextRecord()) {
List obj = new List();
for (int i = 0; i < rcsv.FieldCount; i++)
obj.Add(rcsv[i]);

lobj.Add(obj);
}
}




んー、我ながらショボい。
適当に使って、こんなものだから、きちんと特徴を把握して使用すると、もっと早くなるし、コード量も減るはず。


また、Dobon.netに、CSVの定義が載っておりました。

レコードは、CRLFで区切られる。
最後のレコードは、CRLFを持つかもしれないし、持たないかもしれない。
はじめのレコードは、ヘッダかもしれない。
フィールドは、カンマ(,)で区切られる。フィールドの数は、同じでなければならない。スペースはフィールドの一部であり、無視してはいけない。レコードの最後のフィールドの後にコンマが続いてはいけない。
各々のフィールドがダブルクォートで囲まれているかもしれない。
フィールドにCRLF、ダブルクォート、カンマが含まれる場合、フィールドをダブルクォート(")で囲まなければならない。
ダブルクォートで囲まれたフィールドにダブルクォートが含まれる場合、フィールド内のダブルクォートを2つの連続するダブルクォート(つまり、「""」)に置き換えなければならない。




ふむ、私が作った適当CSVオブジェクトは、全てを満たしていないw
ということで、CSV操作をするなら、A Fast CSV Reader等を使ったほうがいいと思います。
ちなみに、A Fast CSV Readerのコードは結構大量です。
(CSVを操作するだけで、こんな量のコードを読むのはつらい。。。)



テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。