最近プログラミングを始めたのですが、
参考書を読んでも、CSVファイルの読み込み方がわかりません。
参考書が悪いだけかなあ。
1列目に時間、2列目にデータがあるのですが、
別々に読み込んで、処理するにはどうすればいいのでしょうか?
また、私が読み込みしたやり方だとchar型なので、データの操作ができないです。
double型として扱うにはどうすればいいでしょうか?
よろしくオネガイシマス。
こんにちは、motoといいます。私もC言語少し勉強した程度なので
適切なアドバイスにならないと思いますが、分かる範囲でレスします。
読み込んだchar型を整数なら「ans = atoi('文字列');」、倍精度等(float・double)なら
「ans = atof('文字列');」でいいと思いますが、コンパイラによっては文法や
関数名が違いますので、コンパイラのドキュメントやC言語の本で確認して下さい。
char *csv = 12.1,3.14;
double a, b;
scanf(%lf,%lf, &a, &b);
えーと、CVSってテキストファイルですよね。
ですから、各行を文字列で読み込むようにして
カンマを使って行内のデータを分割し、
文字列を数値に変換する関数を使って数値にします。
scanfをつかっている例を挙げておられる方がいますが、
scanfはエラー処理が甘いので関数一発で済ませようとしないで
ちゃんと分解して数値化するロジックを組んでみておいた方が
後々役に立つと思います。
scanfの問題点はあちこちの掲示板でも指摘されていると思うので
ここでは特に指摘しません。
御自分で調べてみてください。
茶々
> えーと、CVSってテキストファイルですよね。
バージョン管理システムです。
もひとつ茶々。
> char *csv = 12.1,3.14;
> double a, b;
> scanf(%lf,%lf, &a, &b);
csvから読みとってないやん。
がーん。
CSVファイルとCVSを間違えとった。
恥ずかしいー。(--;
ちなみに打ち間違いですから。
タ・イ・プ・ミ・ス。(^^;
余計なお世話ですが、読み込む項目のなかに ',' や '' が含まれていると、
CSVの正しい読み込みは途端に厄介になります。ご参考まで。
fopenとfgetsで一行づつ読み込んで
,ごとにやりたい処理をするのが一番ではないかと思います。
先日、',' や '' ありのCSVについて悩んだのですが、
CSVの規格というものはあるのでしょうか?
読込の部分の自作をやめて、下記のクラスを使ったのですが、
そこの作者も知らないとの事でした。
この掲示板でも話題になったことがあったような気がしたのですが、
見つけられませんでした。ご存知のかた、いらっしゃいましたら、
お願いいたします。
http://www.wakhok.ac.jp/~tomoharu/Java/csv/
CSVの仕様には'揺れ'があるみたいです。
たとえば項目中に改行を許すか。許すならその形式は? とか。
情報提供:
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t12.htm
CSVの標準規格ってないんでしょうか.
まあ、普通のCSVなら、boost::tokenizerでいいと思う。
"で囲んだやつと、\でのエスケープを有効にするなら、こんな感じか。
#include <iostream>
#include <algorithm>
#include <boost/tokenizer.hpp>
char str[256];
std::cin.getline(str, sizeof(str))
boost::tokenizer< boost::escaped_list_separator<char> >
csvTokens(str, boost::escaped_list_separator<char>() );
std::copy(csvTokens.begin(), csvTokens.end(), std::ostream_iterator<char>
(std::cout));
> CSVの規格というものはあるのでしょうか?
規格かどうかは分かりませんが、情報を。
The Programmer's File Format Collection
→ http://www.wotsit.org/
ここで CSV を検索すれば…