ちょいと入用でCSV解析のコードを書いてみた。
STLとBoostで完全C++コードになりましたとサ。
#使用は自己責任で
#include <iostream> #include <fstream> #include <string> #include <stdexcept> #include <vector> #include <algorithm> #include <boost/tokenizer.hpp> void main( int argc, char* argv[] ) { try { // argv[1]を入力ファイル名とする if ( argc != 2 ) { throw std::runtime_error( "not input filename" ); } std::cout << "file name : " << argv[1] << std::endl; // ファイルを開く std::ifstream fin( argv[1] ); if ( fin.fail() ) { throw std::runtime_error( "file open error" ); } // 空白、改行をスキップしない fin >> std::noskipws; // ファイルの読み込み std::string data; std::copy( std::istream_iterator< char >( fin ), std::istream_iterator< char >(), std::back_inserter( data ) ); // 改行ごとに区切る typedef boost::char_separator< char > separator; boost::tokenizer< separator > token( data, separator( "\r\n" ) ); std::vector< std::string > line; std::copy( token.begin(), token.end(), std::back_inserter( line ) ); // カンマごとに区切る for ( size_t i = 0; i < line.size(); ++i ) { std::cout << line[i] << std::endl; boost::tokenizer< separator > token( line[i], separator( "," ) ); std::vector< std::string > lineData; std::copy( token.begin(), token.end(), std::back_inserter( lineData ) ); for ( size_t j = 0; j < lineData.size(); ++j ) { std::cout << lineData[j] << std::endl; } std::cout << std::endl; } } catch ( std::exception& ex ) { std::cout << ex.what() << std::endl; } } // EOF
こういうファイルを食わせると
AAAA,BBBB,CCCC,DDDD,EEEE
FFFF,GGGG,HHHH,IIII,JJJJ
aaaa,bbbb,cccc,dddd,eeee
ffff,gggg,hhhh,iiii,jjjj
こうなる
AAAA,BBBB,CCCC,DDDD,EEEE AAAA BBBB CCCC DDDD EEEE FFFF,GGGG,HHHH,IIII,JJJJ FFFF GGGG HHHH IIII JJJJ aaaa,bbbb,cccc,dddd,eeee aaaa bbbb cccc dddd eeee ffff,gggg,hhhh,iiii,jjjj ffff gggg hhhh iiii jjjj
C++ってステキ( ´艸`)