boost::tokenizerでCSVを読み込む

提供: C++入門
2013年3月23日 (土) 16:31時点におけるDaemon (トーク | 投稿記録)による版 (Daemon がページ「Boost::tokenizerでCSVを読み込む」を「boost::tokenizerでCSVを読み込む」に移動しました)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク


C++でCSVの行を扱うには、boost::tokenizerを使うことで、行を比較的簡単にパースできます。ここでは、boost::tokenizerを利用し、CSVファイルを読み込み、パースを行います。

概要

CSVファイルを扱うためには、CSVファイルのエントリをカンマやタブで分割しなければなりません。 ここでは、CSVデータのパースやCSVファイルの読み込みの例を示します。

boost::tokenizer の基本的な使い方については、 boost::tokenizer をご参照ください。

カンマ区切りのCSVを扱う

ソースコード

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
 
typedef boost::tokenizer< boost::escaped_list_separator<char> >
BOOST_TOKENIZER_ESCAPED_LIST;
 
void dump(BOOST_TOKENIZER_ESCAPED_LIST &tokens)
{
        BOOST_FOREACH(std::string s, tokens) {
                std::cout << "<" << s << "> ";
        }
        std::cout << std::endl;
}
 
int
main(int argc, char const* argv[])
{
        std::string str1("2013,\"foo\",,field 4");
 
        BOOST_TOKENIZER_ESCAPED_LIST tokens1(str1);
        dump(tokens1);
 
        return 0;
}

コンパイル

clang++ -I/usr/local/include escape_list_separator_1.cpp -o escape_list_separator_1

実行例

$ ./escape_list_separator_1
<2013> <foo> <> <field 4>

タブ区切りのCSVを扱う

CSV というよりは、TSV です。 タブで区切られたCSVを扱うためには、 boost:escaped_list_separator<char> にタブを指定し、boost::tokenizerの第2引数に指定します。

ソースコード

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
 
typedef boost::escaped_list_separator<char>    
BOOST_ESCAPED_LIST_SEP;
typedef boost::tokenizer< boost::escaped_list_separator<char> >
BOOST_TOKENIZER_ESCAPED_LIST;
 
void dump(BOOST_TOKENIZER_ESCAPED_LIST &tokens)
{
        BOOST_FOREACH(std::string s, tokens) {
                std::cout << "<" << s << "> ";
        }
        std::cout << std::endl;
}
 
int
main(int argc, char const* argv[])
{
        std::string str2("2014\t\"bar\"\t\tfield 4");
 
        BOOST_ESCAPED_LIST_SEP sep_tab('\\', '\t', '\"');
 
        BOOST_TOKENIZER_ESCAPED_LIST tokens2(str2, sep_tab);
        dump(tokens2);
 
        return 0;
}

コンパイル

clang++ -I/usr/local/include escape_list_separator_1.cpp -o escape_list_separator_1

実行例

$ ./escape_list_separator_1
<2014> <bar> <> <field 4>

カンマ区切りのCSVファイルを読み込む

CSVファイル test.csv

2012,"foo",,field 4
2013,"bar",,field 4

ソースコード boost_read_csv.cpp

#include <iostream>
#include <string>
#include <fstream>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
 
typedef boost::escaped_list_separator<char>    
BOOST_ESCAPED_LIST_SEP;
typedef boost::tokenizer< boost::escaped_list_separator<char> >
BOOST_TOKENIZER_ESCAPED_LIST;
 
void dump(BOOST_TOKENIZER_ESCAPED_LIST &tokens)
{
        BOOST_FOREACH(std::string s, tokens) {
                std::cout << "<" << s << "> ";
        }
        std::cout << std::endl;
}
 
int
main(int argc, char const* argv[])
{
 
        std::ifstream   ifs;
        std::string     csv_file_path ("test.csv");
 
        try {
                ifs.open(csv_file_path.c_str() );
                std::string     line;
 
                while (getline(ifs, line) ) {
                        BOOST_TOKENIZER_ESCAPED_LIST tokens1(line);
                        dump(tokens1);
                }
                ifs.close();
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return 0;
}

コンパイル

clang++ -I/usr/local/include boost_read_csv.cpp -o boost_read_csv

実行例

$ ./boost_read_csv
<2013> <foo> <> <field 4>
<2014> <bar> <> <field 4>

タブ区切りのTSVファイルを読み込む

タブ区切りのTSV(CSV)ファイルを読み込む場合には、 以下のようにコードを変更するだけです。

BOOST_ESCAPED_LIST_SEP sep_tab('\\', '\t', '\"');
BOOST_TOKENIZER_ESCAPED_LIST tokens1(line, sep_tab);
int
main(int argc, char const* argv[])
{
 
        std::ifstream   ifs;
        std::string     csv_file_path ("test.csv");
 
        try {
                ifs.open(csv_file_path.c_str() );
                std::string     line;
 
                while (getline(ifs, line) ) {
			BOOST_ESCAPED_LIST_SEP sep_tab('\\', '\t', '\"');
			BOOST_TOKENIZER_ESCAPED_LIST tokens1(line, sep_tab);
                        dump(tokens1);
                }
                ifs.close();
        } catch (std::exception &ex) {
                std::cerr << ex.what() << std::endl;
        }
        return 0;
}

関連項目




スポンサーリンク