- ベストアンサー
csvfファイルの1行目と3行目を出力させたいんです
C言語を使って、csvファイルの1行目と3行目を取り出したいんですが strtokを使って、挑戦しようと押したんですが、いまいちよくわからなかったんです。 簡単でいいので、だれかstrtokの使い方教えてもらえませんか?
- みんなの回答 (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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
> だれかstrtokの使い方教えてもらえませんか? CSVの解析にstrtokは不適切です。 別の方法を検討することをお勧めします。
- Tacosan
- ベストアンサー率23% (3656/15482)
なぜ strtok を使おうと思ったのでしょうか? 確かに strtok を使えば簡単になるといえばなるけど, 個人的にはあまり使う気にならないなぁ. あと, 「いまいちよくわからない」というのは「どこまで理解できてどこが理解できない」のでしょうか?
- asuncion
- ベストアンサー率33% (2127/6289)
>csvファイルの1行目と3行目を取り出したい 読み込んだ行数のカウントをゼロで初期化する。 ファイルをオープンする。 ファイルが読める間、 ファイルを読む。 行数カウントを1増やす。 もし、行数カウントが1または3ならば、 strtokなどの関数を使って当該行から値を切り出す。 もし、行数カウントが4以上ならば、 このループから抜ける。 ファイルをクローズする。 おしまい。
補足
すいません。日本語が間違ってました。 1行目3行目じゃなくて縦の項目、1列目3列目の取り出し方をお聞きしたかったんです。 質問に答えてくれて有難う御座いました。
お礼
有難う御座います。 いろいろ質問させてもらったのを見ると、strtokは不評のようですのですね。このプログラムを参考に別のアプローチを考えたいと思います。