• ベストアンサー

csvfファイルの1行目と3行目を出力させたいんです

C言語を使って、csvファイルの1行目と3行目を取り出したいんですが strtokを使って、挑戦しようと押したんですが、いまいちよくわからなかったんです。 簡単でいいので、だれかstrtokの使い方教えてもらえませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>C言語を使って、csvファイルの1行目と3行目を取り出したい  がメイン(方法問わず)で、 >strtokを使って、  でなくともよい、としてのアドバイス。はずしていたらスルーしてください。 ------------------------------------------------------------------------ 場外? #1 「補足」 >すいません。日本語が間違ってました。  「すみません」かな・・?。  「私はもう、おっぱい『すいません』」なら日本語間違ってないと思います。 ------------------------------------------------------------------------ strtok は評判悪い(↓)ので、前回の質問者様のソースをいじってみました。  http://okwave.jp/qa5382275.html ☆「出力させたい・取り出したい」項目うしろまでの"コンマ"を数え、文字列コピーする、だけの単純な方法です。  ・もし、数値として「使いたい」なら、取り出した文字列を数値に変換するだけ・・。  ・,,,,,,,,,,,,,,,, こんなレコードにも対応?します。 注:対象のCSVファイルは、フィールド自体にコンマが含まれていないこと。   フィールドがダブルクォーテーションで囲まれている場合、そのまま出力。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define RECL 256 // 最大レコード長+1以上を int Kiridashi( char cStr[], char cBuffer[], int iRetsu ) {  int i, iCnt = 0, iCmm, iTop = 0;  for( i = 0; i < RECL; i++ ){   iCmm = 0;   if( '\0' == cBuffer[ i ] ) break;   if( '\n' == cBuffer[ i ] ) iCmm = 1; // 「改行」もコンマ扱い   if( ',' == cBuffer[ i ] ) iCmm = 1;   if( 1 != iCmm ) continue;   iCnt++;   if( iCnt == iRetsu ){    cBuffer[ i ] = '\0'; // 文字列終端処理    strcpy( cStr, &cBuffer[ iTop ] );    cBuffer[ i ] = ','; // 戻し(注:「改行」も)    return( 0 ); // 切出終了   }   iTop = i + 1; // コンマの次が、切出文字列先頭(仮)  }  strcpy( cStr, "コンマ不足+++ continue +++" );  return( 1 ); } int main() {  FILE *fp;  char cBuffer[ RECL ], cStr[ 32 ];  int iRecNo = 0;  fp = fopen( "j0.csv", "r" );  if( fp == NULL ){   printf( "ファイルが開けませんでした。\n" );   exit( -1 );  } // fgets( cBuffer, RECL, fp ); // 1行読み飛ばし(空読み)  while( fgets( cBuffer, RECL, fp ) != NULL ){   printf( "[%03d] ", ++iRecNo );   Kiridashi( cStr, cBuffer, 1 ); // 1列目   printf( "1:%s\t", cStr );   Kiridashi( cStr, cBuffer, 3 ); // 3列目   printf( "3:%s\n", cStr );  }  fclose( fp );  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

fzgu1984
質問者

お礼

有難う御座います。 いろいろ質問させてもらったのを見ると、strtokは不評のようですのですね。このプログラムを参考に別のアプローチを考えたいと思います。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> だれかstrtokの使い方教えてもらえませんか? CSVの解析にstrtokは不適切です。 別の方法を検討することをお勧めします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

なぜ strtok を使おうと思ったのでしょうか? 確かに strtok を使えば簡単になるといえばなるけど, 個人的にはあまり使う気にならないなぁ. あと, 「いまいちよくわからない」というのは「どこまで理解できてどこが理解できない」のでしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>csvファイルの1行目と3行目を取り出したい 読み込んだ行数のカウントをゼロで初期化する。 ファイルをオープンする。 ファイルが読める間、   ファイルを読む。   行数カウントを1増やす。   もし、行数カウントが1または3ならば、     strtokなどの関数を使って当該行から値を切り出す。   もし、行数カウントが4以上ならば、     このループから抜ける。 ファイルをクローズする。 おしまい。

fzgu1984
質問者

補足

すいません。日本語が間違ってました。 1行目3行目じゃなくて縦の項目、1列目3列目の取り出し方をお聞きしたかったんです。 質問に答えてくれて有難う御座いました。

関連するQ&A