「boost::tokenizerでCSVを読み込む」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> C++でCSVの行を扱うには、boost tokenizerを使うことで、行を比較的簡単にパースできます。 __TOC__...」)
 
行56: 行56:
 
$ ./escape_list_separator_1
 
$ ./escape_list_separator_1
 
<2013> <foo> <> <field 4>
 
<2013> <foo> <> <field 4>
<2014> <bar> <> <field 4>
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  

2013年3月10日 (日) 01:51時点における版


C++でCSVの行を扱うには、boost tokenizerを使うことで、行を比較的簡単にパースできます。

概要

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;
}

関連項目