とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Tokenizer を使って CSV をパースするサンプル

CSV 形式は正式な規格というものが存在しないらしいのですが,たいていの CSV ならパースできるであろうサンプルを書いてみました。

  • 空要素 (,, のようにカンマが並ぶ)
  • " ("a,c" のように囲む。\" のようにエスケープする)
  • , (\, のようにエスケープする)
  • \ (エスケープしたり,\ 文字自体を表示する)

こういったケースにうまく対処できます。

// boost::tokenizer サンプル
// CSV をパースする。

#include<string>
#include<iostream>
#include<boost/tokenizer.hpp>
#include<boost/foreach.hpp>

int main()
{
 std::string const csv = "aaa,bbb,ccc\n"     // 通常の , 区切り
                         "aaa,,ccc\n"        // 空要素あり
                         "aaa,\"b,b\",ccc\n" // "" あり
                         "aaa,\\,,ccc\n"     // , のエスケープあり
                         "aaa,\\\",ccc\n"    // " のエスケープあり
                         "aaa,\\\\,ccc\n";   // \ そのものの出力
 boost::escaped_list_separator<char> const separator;
 boost::tokenizer<boost::escaped_list_separator<char>> const
  tokens(csv, separator);
 BOOST_FOREACH(auto const token, tokens)
 {
  std::cout << token << std::endl;
 }
}

実行結果:

aaa
bbb
ccc
aaa

ccc
aaa
b,b
ccc
aaa
,
ccc
aaa
"
ccc
aaa
\
ccc

参照:
Boost Tokenizer Overview

Boost C++ Librariesプログラミング
稲葉 一浩
秀和システム
売り上げランキング: 65859
おすすめ度の平均: 4.0
4 よく使います。
4 boostを初めて使う方、既に使用している方どちらも持っていて損はありません

追記

CSV について eldeshさんにコメントいただきました。

標準というわけでは無いですがRFCは存在するようです
http://tools.ietf.org/html/rfc4180