- ベストアンサー
Visual C++によるcsvファイルの読み込みについて
Visual C++を使い始めたばかりの初心者です。 恐縮ながら、Visual C++でのcsvファイルの処理方法についておたずねさせていただければと存じます。 通常のスクリプト言語では、1行読んできて、"," で split をしてやることで、csvファイルを処理できるのですが、Visual C++ではどのようにするのが効率がいいのでしょうか? csvファイルを簡単に取り扱うことができるようなクラスライブラリが提供されているものなのでしょうか?それとも、1文字1文字、コンマを判定していくのが普通なのでしょうか? よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
1文字1文字、コンマを判定していくしかないと思います。 下記のプログラムは表面的には一文字ずつ判定していないように見えますがfind()の内部でやっているので同じことです。見えるところで一文字ずつ処理するほうが、きめ細かな処理ができるのでベストではないかと思います。 ライブラリを使うほうが見栄えはいいですが。 #include <iostream> #include <string> #include <fstream> using namespace std; int main() { string col[300][10],row; int c,r,p; ifstream f("9437.csv"); if(f.bad()) { cout << "file not found"; exit(EXIT_FAILURE); } r= c = 0; while(!f.eof() && getline(f,row)) { for(;(p = row.find(",")) != row.npos;row = row.substr(p + 1)) { col[r][c] = row.substr(0,p); cout << col[r][c] << ' '; c++; } col[r][c] = row.substr(0,p); cout << col[r][c] << endl; r++; } f.close(); } 9437.csv 日付,始値,高値,安値,終値,出来高,逆日歩,貸株残高,融資残高 2009/03/09,141300,142000,137600,138000,104014,-,11754,17458 2009/03/06,146100,146500,141000,141900,121471,-,11843,17170 2009/03/05,150600,150600,147500,147500,117183,-,10530,16623 2009/03/04,149800,150400,148300,149900,75954,-,8452,11718 2009/03/03,149900,151100,149900,150400,66715,-,7694,10549 2009/03/02,151200,152300,150400,152200,53345,-,8589,8984 2009/02/27,152000,153900,150900,153900,86239,-,6503,7793 2009/02/26,150200,151400,150200,151100,69577,-,7676,8884 2009/02/25,152600,153000,149800,150700,90103,-,4440,11015 2009/02/24,150600,151700,150400,151300,60421,-,5055,8724 2009/02/23,153100,154600,151100,151400,98148,-,4745,8072 2009/02/20,154200,156400,153500,153700,60461,-,4225,7061 2009/02/19,152400,156000,152400,154200,70499,-,6211,7119 2009/02/18,151700,153100,150800,152100,49194,-,6310,8019 2009/02/17,154800,155300,151900,153500,50206,-,5369,7714 2009/02/16,150300,155300,150100,155100,79064,-,5131,7281
その他の回答 (4)
VisualC++2008で、MFCクラスライブラリをお使いなら CStringT::Tokenizeが利用できると思います。 あるいは、AfxExtractSubStringも使えますね。 ただ、ここで言うCSVファイルが、 例えば、ExcelでCSVとして保存したファイルを指しているなら、 ちょっと厄介です。 (','入りやスペース入りをCSVで保存してみてください) もしそうなら、下記の本の第四章をご参照ください。 Brian W.Kernighanがあなたの問いに答えてくれますよ。 http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-%E3%83%96%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3-%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4756136494
お礼
返信が遅くなってすみません。本屋に行って、推薦いただいた本でもみてみます。ありがとうございます。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>Visual C++を使い始めたばかりの初心者です。 う~ん、Borland C++ Builderだと ・読み込み用のTStringListを作る ・分解用のTStringListを別に作る ・作った読み込み用TStringListのLoadFromFile()メソッドでCSVファイルを読み込む ・TStringListのStrings[]プロパティで1行を取り出す ・分解用のTStringListのCommaTextプロパティに、取り出した1行を放り込む ・分解用のTStringListのStrings[]プロパティで、カンマで区切られ済みの項目を取り出す という6ステップ書くだけで可能なんだけど。 ハンパに覚えてしまう前にVisual C++みたいな腐ったコンパイラは捨てて、Borland C++ Builderに乗り換えてみては?
お礼
違った角度からご回答いただきありがとうございます。
- titokani
- ベストアンサー率19% (341/1726)
正式なCSVの仕様では、文字列中に改行コードが含まれることもあるので、 そういったCSVをも処理するなら、一文字ずつ処理するほかになさそうです。 文字列中にカンマなどが含まれないなど、条件が限定できるなら、 fgets+sscanfが楽ですね。
お礼
ご回答ありがとうございます。 参考にさせていただきます。
- redfox63
- ベストアンサー率71% (1325/1856)
ん~ お使いになっている VCのバージョンは何でしょう またプログラミングスタイルはどのようなものなのでしょうか VC++6.0 Professional Win32API + Cランタイム とか VC2005 Express Edition WindowsForm(C++/CLI) Cランタイムでしたら 1行読み込みにはfgetsなどを使います 『,』による分離には strtokや strchrなどで探してstrcpyで別バッファにコピーとか C++/CLIでしたら 1行読み込みは ReadLine 項目の分割には String.Split といった具合です VC2005以降であれば Microsoft.VisualBasic.FileIO.TextFieldParserを使うといった手法もありかと ・・・
お礼
素早いご回答ありがとうございます。 教えていただいた方法で色々と試してみようかと思います。
お礼
返信が遅くなってすみません。コードまで丁寧に記述していただいてありがとうございます。参考にさせていただきます。