いつもお世話になります。
csv形式を読み、2次元vectorに格納したいのです。
以下はcsvとその出力ですが、データ無しカンマ区切りフィールドがあると、vectorに反
映されません。
どのようにすればよいでしょうか?
123, ,B
124,,A
の出力が、
Line0:123
Line0:
Line0:B
--------
Line1:124
Line1:A
となります。
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
// load & build
std::ifstream infile(strpath_.c_str());
if ( !infile.is_open() )
return;
boost::char_separator<char> sep(,);
string strline;
vector<vector<string> > vvec;
vector<string> vec;
while(std::getline(infile, strline)) {
if ( strline.size() != 0 ) {
tokenizer tok(strline, sep);
std::copy(tok.begin(), tok.end(), back_inserter(vec));
vvec.push_back(vec);
}
}
infile.close();
// check data
vector<vector<string> >::const_iterator it = vvec.begin();
int i = 0;
while (it != vvec.end()){
vector<string>::const_iterator itin = (*it).begin();
while(itin != (*it).end()) {
std::cout << Line << i << : << *itin++ << std::endl;
}
std::cout << -------- << std::endl;
*it++;
i++;
}
よろしくお願い申し上げます。
というか、これはstd::copyじゃなくて、boostが原因。
以下のコードで再現します。
string str1 = 123, ,B;
string str2 = 124,,A;
typedef boost::tokenizer<
boost::char_separator<char>
> tokenizer;
boost::char_separator<char> sep(,);
tokenizer tok1(str1, sep);
tokenizer tok2(str2, sep);
cout << str1 << endl;
for (boost::tokenizer<boost::char_separator<char>>::iterator beg =
tok1.begin(); beg != tok1.end(); ++beg) {
cout << *beg << endl;
}
cout << endl;
cout << str2 << endl;
for (boost::tokenizer<boost::char_separator<char>>::iterator beg =
tok2.begin(); beg != tok2.end(); ++beg) {
cout << *beg << endl;
}
解決方法も調べてみました。
boostのchar_separator<char>のコンストラクタ第3引数に
boost::keep_empty_tokens
を指定してやります。
第2引数は、今回の場合、不要なのでNULLでも渡せばいいと思います。
reshia様
すばやいご回答大変ありがとうございました。
boostだったんですね、見当違いをしておりました。
std::replace_copy_if辺りを探しておりましたので...。
今後ともよろしくお願い申し上げます。