質問: ### 課題 プログラミング初心者です。 C言語を授業で習ってるのですが、この問題をどうやれば良いのかさっぱりわかりません。 よろしくお願いします。 ### 問題 番号と緯度,経度のデータがある.これが数字,数字,数字の形式で格納されているファイル「sample.csv」を読み込み,キーボードから指定された番号のデータの緯度の値を表示するプログラムを作成せよ. ### 補足 番号と緯度,経度のデータがある.これが数字,数字,数字の形式で格納されているファイル「sample.csv」を読み込み,キーボードから指定された番号のデータの緯度の値を表示するプログラムを作成せよ. ファイルにデータは最大で7000行格納されているものとする.もしもマイナスの番号やデータ数以上の番号など存在しないデータの番号が指定された場合にはNGと表示する.なおファイル中の番号は飛び飛びに振られている. プログラムの作成方針としては次の2つが考えられるが,どちらの方針で解答してもよい. 方針(1)として,7000行のデータを読み込んで配列に全部格納して,後から目的のデータを探す. 方針(2)として,データを一行読み込んだ時点で,そのデータが目的のものかどうか判定する.これをファイルの最後まで繰り返す csv形式とは次のようにカンマで区切られたデータファイル(カンマ(C)セパレート(S)バリュー(V):「カンマで区切られた値」)のことを呼ぶ. 5,28.2811,34.05 6,28.2813,34.0498 7,28.2807,34.0498 このデータを1行読み込むには次のようにして,変数no,変数d1,変数d2にそれぞれ読み込むことができる.%lf項目と%lf項目の間にカンマが入る点に注意. fscanf(fp, "%lf,%lf,%lf", &no, &d1, &d2) 余談: fscanfを使って素直に読み込めるCSVファイルは数値データ(%dや%lfなどで指定できるもの)だけである.数値以外のデータ(氏名などの文字列)が入ると,その項目を%sで取得しなければならなくなるが,scanfで文字列(%s)を指定するとカンマ記号も文字列の一部と勘違いされるため,うまく区切り位置を判断できなくなる. ### 自分なりに作成したプログラム ♯include ♯include int main() { FILE *fp1; double data[7000][3]={}; int i,j; double n; if((fp1=fopen("sample.csv","r"))==NULL){ printf("NG"); exit(1); } scanf("%lf",&n); for(i=0;i<7000;i++){ for(j=0;j<3;j++){ if(fscanf(fp1,"%lf",&data[i][j])!='\0'){ } } } for(i=0;i<7000;i++){ if(data[i][0]==n){ printf("%lf",data[i][1]); break; } } if(data[i][0]!=n){ printf("NG"); } fclose(fp1); return 0; }
回答: Cなど不要。そう、シェル芸ならね! ``` $ read n;awk -F, -vn=$n 'n==$1&&a=$0=$2;END{if(!a)print "NG"}' sample.csv 6 28.2813 ```