- ベストアンサー
csvファイルのデータをCで読み込みたいのですが
大学の研究でC言語を利用しています。 csvファイルの値を読み込んで計算したいのですが、読み込む方法(プログラム)が分かりません。 現在、csvファイルの値をテキストファイルにコピーアンドペーストし、それからCで読み込んでいます。 何かいい方法は無いでしょうか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
No5の方のおっしゃる通りです。 文字数を数えなくても カンマからカンマまでの間の文字を取り出せます。
その他の回答 (8)
- hana-hana3
- ベストアンサー率31% (4940/15541)
>1つのプログラムでまとめて読み込むにはどうしたらいいのか CSVファイルを読むには”文字数”は関係ありません。 [,]で区切られたデータなら簡単に取り出すことが出来ます。 あとは、必要なデータの先頭位置(地点名)と不要なタイトル(単位)、必要なデータ(2番目)を判断して取り出すプログラムを書けばよいのです。 1行目(データー数4個) 地点コード(数値)?、地点名(文字)、年(数値)、月(数値) 2行目(不要行)・・・読み飛ばし。 3行目~(データ数n個)データ番号(数値)シリアル値?、測定データn1,n2・・・ 必要なデータのみ取り出して格納。 : 空行かヘッダ(次のデータの先頭)が来たらデータを保存・・・ 等として、読み込んだデータを判別する方法をプログラミングすることになります。 この程度のプログラムが書けないなら、エクセルに読み込んで不要なデータを削除して(あるいは必要なデータをだけを取り出す)CSV保存する方が、今までのテキスト貼り付けの方法よりも数倍早いかも知れませんよ。
お礼
細かい説明ありがとうございます。 カンマ区切りのデータが読める、という事さえ分かれば大丈夫です。 今からプログラム作ってみます。 ありがとうございました!
- uyama33
- ベストアンサー率30% (137/450)
データの行のサンプルを3行分書いてください。
補足
4行分書きます。 11001,SOYAMISAKI ,2004,12 ,(mm),,(mm),,(m/sec),,(m/sec),,(/16),,(゜C),,(゜C),,(゜C),,(h),,(cm),,(cm),,(cm),,(cm) 01,0000,0,000,0,12.0,0,16,0,13,0, 00.8,0, 02.8,0,-01.5,0,00.1,0,///,9,///,9,///,9,///,9 02,0000,0,000,0,11.9,0,15,0,14,0, 00.5,0, 04.4,0,-01.7,0,00.9,0,///,9,///,9,///,9,///,9 これはアメダスのデータです。 これより下に数値が続きます。 この場合、3行目以降の行、左から2つめの値だけを読み込みたいのです。 1行目にSOYAMISAKIと地名がありますが、違う地点で計測したデータだと文字数が異なるため、1つのプログラムでまとめて読み込むにはどうしたらいいのか、という質問です。
- a-saitoh
- ベストアンサー率30% (524/1722)
補足を書く前に他の人のアドバイスをちゃんと読みましょう. たとえばstrtokを使う方法など,カンマの位置で区切って文字列を切り出す方法が説明されてるんですよ.
お礼
回答をしっかりと見もせず、自分の質問ばかり書いてすいませんでした。 strtokですか、今から調べて試してみます。
- Trick--o--
- ベストアンサー率20% (413/2034)
一行ずつ読んで(fgets())カンマで区切って(strtok())使えばよいのでは?
お礼
まだ初歩的なプログラムしか分からなくて、最初回答の意味が分かりませんでした。 カンマ区切りでデータを読めるんですね。 今からプログラム作ってみます。 ありがとうございました!
補足
すいません、大事な部分を書いていませんでした… 使いたいcsvファイルは、最初に地名などの文字、後半に数値がはいっているもので、後半の数値だけを読み込みたいのです。しかし前半に地名があり文字数が一定でないため、一定の文字数を数えて必要な部分だけ読み込む、という方法が使えません。 文字数が異なるcsvファイルの必要な部分だけを読み込みたいのです。何かいい方法はないでしょうか? この文章、分かりにくいかもしれませんがお願いします。
- ultraCS
- ベストアンサー率44% (3956/8947)
小手先のテクニックだけど CSVファイルを読んだら、,を全てヌル(00h)に置き換えちゃいます、このとき、クォーテーションやダブルクォーテーションで挟まれているカンマは例外処理になるので、工夫してください。二バイト文字もそうですね。 こんな関数を一つ作り、このヌル変換した回数を返してやれば、その中に何個のフィールドがあるかわかります。 後は、先頭にポインタを戻せば、それが一個めの要素のASCIZ文字列です。処理後はstrlen+1だけポインタを動かせば次の要素、と言う具合に全要素が得られます。 まあ、エラーや例外の処理はガンバってください
補足
すいません、大事な部分を書いていませんでした… 使いたいcsvファイルは、最初に地名などの文字、後半に数値がはいっているもので、後半の数値だけを読み込みたいのです。しかし前半に地名があり文字数が一定でないため、一定の文字数を数えて必要な部分だけ読み込む、という方法が使えません。 文字数が異なるcsvファイルの必要な部分だけを読み込みたいのです。何かいい方法はないでしょうか? この文章、分かりにくいかもしれませんがお願いします。
- a-saitoh
- ベストアンサー率30% (524/1722)
テキストファイルにコピーアンドペーストした結果を読み取るCプログラムがすでにあるのなら,そのプログラムでCSVが直接読めるのでは? CSVファイルはテキストファイルなので,テキストファイルにコピーアンドペーストしなくても ???.csvをオープンして読めば良いと思いますが. ,や”” による区切りやクォーテーションの処理ができないという質問でしょうか?
補足
すいません、大事な部分を書いていませんでした… 使いたいcsvファイルは、最初に地名などの文字、後半に数値がはいっているもので、後半の数値だけを読み込みたいのです。しかし前半に地名があり文字数が一定でないため、一定の文字数を数えて必要な部分だけ読み込む、という方法が使えません。 文字数が異なるcsvファイルの必要な部分だけを読み込みたいのです。何かいい方法はないでしょうか? この文章、分かりにくいかもしれませんがお願いします。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>csvファイルの値をテキストファイルにコピーアンドペーストし、 csvファイルって、もともとテキストファイルなんですけど・・・。 メモ帳等で開いて見たことはありませんか?
補足
すいません、大事な部分を書いていませんでした… 使いたいcsvファイルは、最初に地名などの文字、後半に数値がはいっているもので、後半の数値だけを読み込みたいのです。しかし前半に地名があり文字数が一定でないため、一定の文字数を数えて必要な部分だけ読み込む、という方法が使えません。 文字数が異なるcsvファイルの必要な部分だけを読み込みたいのです。何かいい方法はないでしょうか? この文章、分かりにくいかもしれませんがお願いします。
- fallen_angel
- ベストアンサー率12% (287/2339)
一番単純なのは、csvファイルから1文字ずつ読み込んで、区切り記号(,かTABですかね)の間の文字列を連結すればできるでしょう。 もっと簡単な方法を他の方が教えてくれるかもしれませんね。
補足
すいません、大事な部分を書いていませんでした… 使いたいcsvファイルは、最初に地名などの文字、後半に数値がはいっているもので、後半の数値だけを読み込みたいのです。しかし前半に地名があり文字数が一定でないため、一定の文字数を数えて必要な部分だけ読み込む、という方法が使えません。 文字数が異なるcsvファイルの必要な部分だけを読み込みたいのです。何かいい方法はないでしょうか? この文章、分かりにくいかもしれませんがお願いします。
お礼
カンマ区切りのデータって読めるんですね。 知りませんでした。 結構初歩的な問題だったようですね。 今からプログラム作ってみます。 ありがとうございました!