csvファイルからNULLも含めてデータを読み込むには?

解決


jack  2004-10-16 11:52:22  No: 54772

初めて質問します。初心者です。よろしくお願いします。

str = "a,111,,,2,bb"
上記のようなデータをそれぞれ読み込むにはどうしたら良いでしょうか?
strtok(str,",") を使うと、
データが無いところが飛ばされてしまうので、データの順番がおかしくなってしまいます。それらを飛ばさずに下記のようにするにはどうすれば良いでしょうか?

data[1]="a"
data[2]="111"
data[3]=""
data[4]=""
data[5]="2"
data[6]="bb"


monkey  2004-10-16 21:36:38  No: 54773

> どうすれば良いでしょうか?

当たり前の話ですが、ライブラリの関数だけで実現できないロジックは自分で組み立てます。

// Cの例(オーバーフロー対策は省略)
#include <stdio.h>
#define  COLS   16 // カラム数の上限
#define  WIDTH  32 // 1カラムあたり文字数('\0'含む)の上限

int main()
{
    const char* str = "a,111,,,2,bb"; // sample string

    char data[COLS][WIDTH];
    int cols, i;
    const char* p;

    cols = i = 0;
    for( p = str; *p != '\0'; p++ )
    {
        if( *p != ',' )
        {
            data[ cols ][ i++ ] = *p;
        }
        else
        {
            data[ cols++ ][ i ] = '\0';
            i = 0;
        }
    }
    data[ cols++ ][ i ] = '\0';

    for( i = 0; i < cols; i++ )
    {
        printf( "data[%d] = \"%s\"\n", i, data[ i ] );
    }
    return 0;
}

// C++の例
#include <string>
#include <vector>
#include <iostream>

int main()
{
    using namespace std;

    const string str = "a,111,,,2,bb"; // sample string

    vector< string > data;

    string::size_type s = 0;
    for( string::size_type e = str.find_first_of( ',' ); e != string::npos; e = str.find_first_of( ',', s ) )
    {
         data.push_back( str.substr( s, e - s ) );
         s = e + 1;
    }
    data.push_back( str.substr( s ) );

    for( vector< string >::size_type i; i < data.size(); ++i )
    {
        cout << "data[" << i << "] = \""<< data[i] << "\"" << endl;
    }
}

/* 実行結果(C, C++共通)
data[0] = "a"
data[1] = "111"
data[2] = ""
data[3] = ""
data[4] = "2"
data[5] = "bb"
*/


jack  2004-10-17 09:27:01  No: 54774

素早いご返答ありがとうございます。
正直、こんなに早くさくっと教えていただいて少々感激しております。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加