ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

CSV解析

ちょいと入用で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++ってステキ( ´艸`)