いったんメモリに読込んだCSVファイルを読むには?

解決


田中さん  2005-08-18 02:33:43  No: 58691

開発環境  VisualC.NET WindowsSDK
メモリに読込んだCSVファイルの処理についてお尋ねします。

csvBuffに読込んだCSVデータを一行ずつ読込んで項目毎に処理をしたいと思っています。
そこで、strtokで一行ずつ処理しようと思っているのですがうまく行きません。
コードは以下のような物を考えました。
char *tokenLine;//一行ごとのポインタ
char *tokenBuf;//1項目ごとのポインタ
OutputDebugString("--読み込み開始\n");

//一行読み込み
tokenLine=strtok(lpszBuf,"\n");
while(tokenLine !=NULL){
  tokenBuf=tokenLine;
  //一項目読み込み
  token=strtok(tokenBuf,",");//※ここで行のポインタが変わってしまう
  while(token !=NULL){
    OutputDebugStr(token);
    token=strtok(NULL,",");
  }
tokenLine=strtok(NULL,"\n");
}

このコードで一行目しか読込めません。tokenLineのポインタが次に進まない為で、
中のwhileのtokenの処理をしなければ行毎の読み込みは成功します。

メモリ上のデータを一行づつ読込んで処理する場合ばどのようにするのがいいでしょうか?


Blue  2005-08-18 03:05:48  No: 58692

strtokの第1引数にNULLを指定したときの仕様を確認してください。

行も区切り文字としてよいならば

token = strtok( buf, ",\n" );

というのはどうでしょうか?(第2引数は区切り文字リスト)

これがダメなら、うまいことNULLになったときに区切り文字を切り替えて処理するのかな。
先に全て\nで区切るほうが楽ですけれどね。。
# ファイルからならfgetsで簡明なんですけど。


田中さん  2005-08-18 04:48:03  No: 58693

strtokの仕様を再確認してコードを書き直しました。
  char *token;
  OutputDebugString("--読み込み開始\n");

  token=strtok(lpszBuf,",");
  while(token !=NULL){
//読込んである文字を出力
    OutputDebugStr(token);

    token=strtok(NULL,",\n");
}

としました。

現在の問題としては、行の最後の文字列が  文字+改行で出てしまってちょっと悩んでます。
>先に全て\nで区切るほうが楽ですけれどね。。
ちょっとこのコード考えてみます。


まきじ  2005-08-18 04:54:55  No: 58694

fgets() で 1 行を読み込んで、strtok() で区切ればどうでしょうか?


田中さん  2005-08-18 05:54:49  No: 58695

今までの事からfgetsでの処理を考えてみました。。こんな感じで大丈夫でしょうか?
  FILE *stream;
  char line[256];  //一行分のデータ
  char *readline;
  char *token;

  stream=fopen(readFilePath,"r");
  if (stream != NULL){
    readline=fgets(line,sizeof(line),stream);
    while (readline!=NULL){
      token=strtok(readline,",");
      while(token != NULL){
        OutputDebugStr(token);
        token=strtok(NULL,",\n");
      }
      readline=fgets(line,sizeof(line),stream);
    }
  }
  fclose(stream);


Blue  2005-08-18 07:50:51  No: 58696

fgetsはstrtokと違い、最初と2回目以降が特殊でないので、

while ( fgets( line, sizeof( line ), stream ) != NULL )
{
    token = strtok( line, ",\n" );
    while ( token != NULL )
    {
        OutputDebugStr( token );
        token = strtok( NULL, ",\n" );
    }
}

としたほうが見やすいかな。


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

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






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