プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/24 09:19

> だれかstrtokの使い方教えてもらえませんか?



CSVの解析にstrtokは不適切です。
別の方法を検討することをお勧めします。
    • good
    • 0

なぜ strtok を使おうと思ったのでしょうか? 確かに strtok を使えば簡単になるといえばなるけど, 個人的にはあまり使う気にならないなぁ.


あと, 「いまいちよくわからない」というのは「どこまで理解できてどこが理解できない」のでしょうか?
    • good
    • 0

>csvファイルの1行目と3行目を取り出したい



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

この回答への補足

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

補足日時:2009/10/21 16:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!