
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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
有難う御座います。
いろいろ質問させてもらったのを見ると、strtokは不評のようですのですね。このプログラムを参考に別のアプローチを考えたいと思います。
No.2
- 回答日時:
なぜ strtok を使おうと思ったのでしょうか? 確かに strtok を使えば簡単になるといえばなるけど, 個人的にはあまり使う気にならないなぁ.
あと, 「いまいちよくわからない」というのは「どこまで理解できてどこが理解できない」のでしょうか?
No.1
- 回答日時:
>csvファイルの1行目と3行目を取り出したい
読み込んだ行数のカウントをゼロで初期化する。
ファイルをオープンする。
ファイルが読める間、
ファイルを読む。
行数カウントを1増やす。
もし、行数カウントが1または3ならば、
strtokなどの関数を使って当該行から値を切り出す。
もし、行数カウントが4以上ならば、
このループから抜ける。
ファイルをクローズする。
おしまい。
この回答への補足
すいません。日本語が間違ってました。
1行目3行目じゃなくて縦の項目、1列目3列目の取り出し方をお聞きしたかったんです。
質問に答えてくれて有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Excel(エクセル) EXCEL マクロで 同じフォルダ内の複数ファイルの複数行全体を選択して1つのファイルに集約 4 2022/09/27 18:41
- その他(プログラミング・Web制作) エクセルVBA 3 2022/06/11 16:01
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語にてXMLファイルから任意...
-
CGIコンパイルエラーについ...
-
構造体のメンバにファイルポイ...
-
VisualStudioでのファイルの入...
-
テキストファイル内に対して, ...
-
c言語でのfscanfについて
-
C言語でファイルの内容を strto...
-
複数ファイルの同時読み込みの...
-
csvfファイルの1行目と3行目を...
-
ファイル出力で改行を入れたい!
-
C言語 共用体の構造体の引数設定
-
C言語を用いて、csvファイル内...
-
fscanfで格納された変数がおか...
-
【C言語】ファイルを読み込んで...
-
C言語 バイナリデータのサイズ...
-
バイナリファイルの読み込み(C...
-
fscanfでループしてしまう。
-
テキストファイルをバイナリフ...
-
CRC32の計算方法
-
C言語でセグメンテーションエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
c言語でのfscanfについて
-
ファイルへの書込み処理が異常...
-
ファイル出力で改行を入れたい!
-
fscanfでループしてしまう。
-
C言語にてXMLファイルから任意...
-
テキストファイル内に対して, ...
-
datファイルの読み込み
-
ファイルに行番号を追加
-
大量の入力ファイルを扱うとき...
-
辞書順にソートしたいのですが...
-
InternetReadFileを使ったファ...
-
C言語 連番データの読み込み
-
C言語におけるファイル読み込み...
-
数値のみ抽出(C言語)
-
簡易grep関数ができません。助...
-
VisualStudioでのファイルの入...
-
fgets( ) の返り値は何?
おすすめ情報