• ベストアンサー

C言語でテキストファイルのデータ処理

はじめまして。 僕はC言語に関して全くの初心者です。 どうぞよろしくお願いします。 例えば、 1,0,0,7,6 2,0,0,5,5 3,1,0,4,9 : : のようなテキストファイル、test.txtがある時、 1行目の4カラム目(7)と5カラム目(6)を、 それぞれの行について差し引くプログラム、 つまり全ての行について4カラム目は7を引き、 5カラム目は6を引くプログラムの事で、 この例では、 1,0,0,0,0 2,0,0,-2,-1  3,1,0,-3,-3 : : となるようなプログラムを書き、結果を出力したいのですが、よく分かりません。 ちなみにawkで書いて実行すると、 (プログラム名はtest.awkとする) BEGIN{ i=0; } { while(i<1){ v3 = $4; v4 = $5; i++; } print $1,$2,$3,($4 - v3),($5 - v4); } 実行するプログラム↓ awk -f test.awk test.txt という感じなのですが…。 これを上述の様に、C言語でプログラムを書いて、 実行するには、例えばどのようなプログラムを書けば いいのでしょうか? なにぶん初心者のため、分からない事だらけですが、 よろしくお願いしますm(__)m

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ベタですが、こんな感じかと。 必要に応じて適当に修正して下さい。 ----------------------------------- #include <stdio.h> int main(int argc, char *argv[]){ FILE *fp; int v3, v4; int F[5]; int c; if(argc != 2){ fprintf(stderr,"usage:test.exe file\n"); return 1; } if(NULL==(fp=fopen(argv[argc-1],"r"))){ fprintf(stderr, "%s can't open!",argv[argc-1]); return 2 ; } v3=v4=0; while(feof(fp)==0){ c=fscanf(fp,"%d,%d,%d,%d,%d",&F[0],&F[1],&F[2],&F[3],&F[4]); if(c<=0) break; if(v3==0 && v4==0){ v3=F[3]; v4=F[4]; } printf("%d,%d,%d,%d,%d\n", F[0], F[1], F[2], F[3]-v3, F[4]-v4); } fclose(fp); return 0; }

chikenguy
質問者

お礼

ご回答ありがとうございますm(__)m このプログラムを参考にさせて頂き、 やってみたいと思いますm(__)m

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>ANo.1を見よ。この手順が忠実に実装されています。 ふえっ! >4. 最初の一回だけ4,5番目のカラム値を保持する が怪しいですね。 (i を使いたくなかっただけなんですが、重大な意図しない動作の場合が・・) AWKでしてるようにすればいいんですけど・・ 念のため

回答No.4

なんのためにそういうことがしたいのかがよくかりません。awk でできているのでそれでいいのでは? カラムというフォーマットのデータを読むということがしたいのでしょうか? 標準入力でいいのでしょうか、それともファイルをオープンしたいのでしょうか? 読み込んだデータに色々な処理をしたいのでしょうか? データを全部読み込むだけのメモリーがありますか? とりあえず、よくあるパターンで、標準入力から、fgets で一行読み込んで、 そこから sscanf でフォーマットのあるデータを読み込んで、それを表示するといったことからはじめてはどうでしょう。

回答No.3

> もしよろしければ、簡単なプログラム例を教えて頂けないでしょうか? ANo.1を見よ。この手順が忠実に実装されています。

回答No.2

1. ファイルを開ける 2. 一行読む。読めなかったらおしまい 3. カラムに分解する 4. 最初の一回だけ4,5番目のカラム値を保持する 5. 4.で保持した値を引く 6. プリントする 7. 2.に戻る これを忠実に実装してください。

chikenguy
質問者

お礼

ご回答ありがとうございますm(__)m 全体的な流れはなんとなくわかったのですが、 もしよろしければ、簡単なプログラム例を教えて頂けないでしょうか?

関連するQ&A

  • C言語 テキストデータの読み込み方法をお願いします

    C言語初心者です。 以下の小数値のみデータ(*.txt)を読み込みたいのですが、 うまくいきません。 よろしくお願いします。 2010/4/28 11:44,984000,-142.160004 2010/4/28 11:44,984100,-141.869995 2010/4/28 11:44,984200,-142.580002 ・ ・ ・ ・ 60000行

  • C言語のテキストファイルの読込み

    必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • C言語 ファイル入出力について

    test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいのですがどうもうまくいきません。色々ネットで探したりしたのですがstrlenをうまく使うのかな~ぐらいしか見当はつきません・・・。 何かよいアドバイスをお願いします!m(_ _)m 例 test.txt --------------------------------- 私の一番好きな食べ物はリンゴです。 --------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ test1.txt ---------------------------------- 私の一番好きな 食べ物はリンゴ です。 ----------------------------------

  • C言語での置換処理について

    引数で指定されたディレクトリ配下のファイル全てに置換処理を行う 処理をC言語で作成したいと考えています。 ディレクトリ配下には、最大で100MB位のファイルが約100件存在する 想定です。 (ファイルのサイズ、件数は実行毎に異なります。) そこで2点ほど教えていただきたいことがあります。 1.基本的に、UNIXコマンドのtrコマンドでで置換するより、C言語で   全てのファイルを開き1行ずつ、「置換文字列のチェック」→   「置換文字列が存在すれば置換」→「ファイル書込み」と行った   ほうが早いものでしょうか?   (trコマンドを実行したところ、10分待っても処理が完了しませんでした。) 2.C言語にてディレクトリ配下のファイル名を取得し、ファイルの   件数分ループさせるにはどのようにすればよいのでしょうか?   execコマンドにて「ls -l test.txt | awk '{print $○}'」   (ファイル名のみ取得)の結果をファイルに出力し、そのファイル   からファイル名を取得し、EOFになるまでループすることで出来る   と思いますが、この方法は一般的でしょうか?   出来れば余計なファイルは、作成したくないと考えています。 ご回答の方、よろしくお願いします。

  • C言語について

    C言語初心者です。 「かんたんC言語」という書籍で学習しております。 コマンドプロンプトでのプログラムの実行方法がよくわかりません。 教えて頂けないでしょうか?

  • C言語でのファイルへの出力について

    1つのプログラムで、複数のファイルを出力したいと考えております。 ファイル名も test_1.txt test_2.txt   ・   ・   ・ test_100.txt というように、番号のみ違うものに。 そして手動ではなく、for文などを用いてファイル名を決めたいです。 つまり、 for(i=0;i<100;i++){   fp = fopen("test_i.txt","w") } みたいなことをしたいのです。 でも上記のようだとエラーが出ます。 どうしたらよろしいのでしょうか…。

  • 大きな2つのファイルから共通するデータを抜き出す方法を教えてください。

    2つのテキストファイルから共通する行を高速に抜き出す方法に困っています。 fileA.txtには 139 36.1 139.01 36.1 139.02 36.1 という感じで1万行ぐらいあり、 fileB.txtには 138.8 36.3 0.01 138.81 36.3 NaN 138.82 36.3 0.01 という感じで100万行ぐらいあります。 fileAと1、2欄目が共通する行をfileBから抽出しようと思って以下のawkのスクリプトを書きましたが、処理に異様に時間がかかってしまいました(5時間かけてたった300行ぐらいしか処理できない!)。 もっと高速に処理するための方法をぜひ教えてください。 BEGIN{FS="\t" while(getline <"fileA.txt" > 0) form[++n]=$1":"$2 } {for(i=1;i<=n;i++){ temp=form[i] if($1":"$2 == temp){print $0} } }

  • 沢山のテキストファイルを一つに

    下のように、Testフォルダに Area1、Area2・・・とフォルダがあり、 その中に、Sample.txtがあります。 C:\Test\Area1\Sample.txt C:\Test\Area2\Sample.txt C:\Test\Area3\Sample.txt ・ ・ ・ C:\Test\Area30\Sample.txt それぞのフォルダのSample.txtは "1234567890.123" "2345678901.234" "3456789012.345" . . . のように、数桁の数字が数百行並んでいます。 例えば、 Area1\Sample.txt に100行、 Area2\Sample.txt に200行、 Area3\Sample.txt に150行あるとします。 これを、 1~100行にArea1\Sample.txtの内容を、 101~300行にArea2\Sample.txtの内容を、 301~450行にArea3\Sample.txtの内容を、 として、Area30までのSample.txtを並べた 一つのテイストファイルに書き直したいのですが、 何しろ沢山あるので、一つ一つ開いてコピぺでは、 書き落としなども心配ですし、毎回大変時間が掛かります。 簡単に並べて書き出す方法はないでしょうか。 Excel等を使ってできないでしょうか。 宜しくお願いします。

  • C言語でフルパスのファイル読み込み方法について

    VBAからC言語の勉強を始めたのですが、 c:\test\myfile.txt というファイルを読み込むとき FILE *fp; fp = fopen("c:\\test\\myfile.txt", "r"); というようにアドレスバーからパスをコピーして貼り付けた後、\を\\に置換しなければなりません。 そのままパス情報を使えていたVBAのプログラムよりかなりわずらわしく感じるのですが、C言語ではファイルの読み込みでフルパスを指定して読み込むのは一般的ではないのでしょうか。 それともほかにやり方(\のままパスを設定する方法)があるのでしょうか。 なんだか使い勝手が違ってちょっと戸惑っているのですが、よろしくお願いします。