久しぶりに、手持ちのMacにBoost C++ Librariesを導入したので、思い出しがてら使ってみた。
とりあえず、Tokenizerを使ってcsvファイルを処理してみる。入力ファイルとして、次のような内容の"tokendata.csv"というファイルを用意した。
- 1,2,3,4,5,6,7,8,9,10
- 1,,3,4,5,6,7,8,9,10
- boost,tokenizer,boost tokenizer,"boost tokenizer"
- ひらがな,カタカナ,漢字
このファイルを行単位で読み込み標準出力に表示し、続けてカンマで分割したものを表示していく。ソースは以下の通り。
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <cstdlib>
- #include <boost/tokenizer.hpp>
- using namespace std;
- using namespace boost;
- int main(){
- typedef char_separator<char> c_separator;
- typedef tokenizer<c_separator> tokenizer;
- string line;
- c_separator csv_sep(",", "", keep_empty_tokens);
- ifstream incsv("./tokendata.csv");
- while ( getline(incsv, line) ){
- cout << line << endl;
- cout << "-----TOKENS-----" << endl;
- tokenizer csv_tokens(line, csv_sep);
- for (tokenizer::iterator ct_iter = csv_tokens.begin();
- ct_iter != csv_tokens.end();
- ++ct_iter){
- cout << "\t" << * ct_iter << endl;
- }
- cout << "-----TOKENS-----" << endl << endl;
- }
- incsv.close();
- return EXIT_SUCCESS;
- }
7行目:Boost Tokenizerのヘッダをインクルードする。
10行目:boost名前空間を使用する
13,14行目:名前が長いのでtypedefする。13行目が区切り文字、14行目がtokenizer本体
18行目:区切り文字を設定する。第一引数が区切り文字、第二引数はトークンとして残す区切り文字、第三引数は空トークンの扱い。第三引数のデフォルトは"drop_empty_token"となっていて、空の場合は捨てられる。今回は"keep_empty_token"を指定して、空トークンも空として認識するようにする。つまり、カンマが連続した場合は空の値として扱う。
24行目:tokenizerを定義して行をトークン分割する。
25〜29行目:イテレータを使って分割したトークンを表示する。
実行結果は
- MacBook:work inchoki$ ./tknzer
- 1,2,3,4,5,6,7,8,9,10
- -----TOKENS-----
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- -----TOKENS-----
- 1,,3,4,5,6,7,8,9,10
- -----TOKENS-----
- 1
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- -----TOKENS-----
- boost,tokenizer,boost tokenizer,"boost tokenizer"
- -----TOKENS-----
- boost
- tokenizer
- boost tokenizer
- "boost tokenizer"
- -----TOKENS-----
- ひらがな,カタカナ,漢字
- -----TOKENS-----
- ひらがな
- カタカナ
- 漢字
- -----TOKENS-----
いい感じでできているみたいだ。
コメント