ブログの説明
パソコンやアンドロイドなどの情報を収集しまとめているブログです。

記事内に張られている画像はクリックすると見やすいサイズの画像が表示されるようになっています。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
アクセスカウンター
検索フォーム
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CSV読み込みサンプル(C++)

CSVデータを良く使うようになったのでサンプルプログラムを作りました。

このサンプルは特に必要なヘッダーはありませんが、一行のデータがBUFF_SYZEを超えてはいけないものです。
もし、長さが分からない場合などは大きめにバッファをとるか、C++版を使ってください。

#define BUFF_SYZE 256//読み込みバッファのサイズ
//////////////////////////////////////////
// 説明 データを分解する。
// 第1引数 1行分のCSVデータ
// 第2引数 データ番号
// 戻り値 データ数 ファイルを開けなかった場合は-1になる
//////////////////////////////////////////
int csvParser(char *sorce , int dataNum)
{
    char *pSorce,*pBuff;
    char buff[BUFF_SYZE];
    //ポインタ初期化
    pSorce = sorce;
    pBuff = buff;
    int dataCounter = 0;//何番目のデータを読み込んでいるかをカウントする
    while( *pSorce != NULL )
    {
        if( *pSorce == ',' || *pSorce == '\n' || *pSorce == '\r')
        {
            *pBuff = NULL;//文字列終端文字を入れる
            switch( dataCounter )
            {
                //データをここで表示する
                case 0:cout << buff << "  " ; break;
                case 1:cout << buff << "  " ; break;
                case 2:cout << buff << "  " ; break;
                case 3:cout << buff << "  " ; break;
                case 4:cout << buff << "  " ; break;
                case 5:cout << buff << "  " ; break;
                case 6:cout << buff << "  " ;
            }
            dataCounter++;//データ番号をカウント
            pBuff = buff;//バッファを初期化
            //*pSorceが改行コードだったら(行の一番後ろまで読み込んだら)分解ループ終了
            if( *pSorce == '\n' || *pSorce == '\r' ) break;
        }
        else
        {
            *pBuff = *pSorce;
            pBuff++;
        }
        pSorce++;//次の文字に移動
    }
    //改行する
    cout << endl;
    return 0;
}
 
//////////////////////////////////////////
// 説明 ファイルを読み込む関数
// 第1引数 CSVファイル名
// 戻り値 データ数 ファイルを開けなかった場合は-1になる
//////////////////////////////////////////
int readFile(char *fileName)
{
    FILE *csvFile;
    char buff[BUFF_SYZE];
    int dataCount = 0;
    if( fopen_s( &csvFile , fileName , "r") == 0)
    {
        //ファイルを開けたら
        while( fgets(buff , sizeof(buff) , csvFile ) != NULL )
        {
            csvParser(buff , dataCount);
            dataCount++;
        }
        fclose(csvFile);
        return dataCount;
    }
    return -1;
}

こちらがC++版です。
いくつかC++のヘッダーが必要ですがこちらの方が安全です。
データ取得は相対参照になっているベクターで行います。

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;


//////////////////////////////////////////
// 説明 データを分解する。
// 第1引数 1行分のCSVデータ
// 第2引数 データベクター
// 戻り値 データ数 ファイルを開けなかった場合は-1になる
//////////////////////////////////////////
int csvParser(string sorce , vector<string> &data)
{
	char *pSorce;
	string buf;
	//ポインタ初期化
	pSorce = &sorce.at(0);
	while( *pSorce != NULL )
	{
		if( *pSorce == ',' || *pSorce == '\n' || *pSorce == '\r')
		{
			data.push_back( buf ); //バッファをベクターに入れる

			//*pSorceが改行コードだったら(行の一番後ろまで読み込んだら)分解ループ終了
			if( *pSorce == '\n' || *pSorce == '\r' ) break;

			buf = "";//バッファを空っぽに
		}
		else buf += *pSorce; //つなぎ合わせる
		pSorce++; //次の文字に移動
	}
	return 0;
}

int readLine()
{
	ifstream ifs( "data.txt");
	string buf;
	vector<string> data;
	if( !ifs )
		return -1; //ファイルオープンエラー

	while(getline(ifs, buf)) {
		buf+="\n";//改行コードが削除されているので、付け足す
		csvParser( buf , data );
		for( int i = 0 ; i < data.size() ; i++ )
		{
			//読み込んだデータを処理する
			//サンプルなので、表示のみ
			cout << data[i] << endl;
		}
	}

	return 0;
}

COMMENT

EDIT COMMENT

非公開コメント

最新トラックバック
ブロとも申請フォーム
QLOOKアクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。