アプリ版:「スタンプのみでお礼する」機能のリリースについて

Visual C++を使い始めたばかりの初心者です。
恐縮ながら、Visual C++でのcsvファイルの処理方法についておたずねさせていただければと存じます。
通常のスクリプト言語では、1行読んできて、"," で split をしてやることで、csvファイルを処理できるのですが、Visual C++ではどのようにするのが効率がいいのでしょうか?
csvファイルを簡単に取り扱うことができるようなクラスライブラリが提供されているものなのでしょうか?それとも、1文字1文字、コンマを判定していくのが普通なのでしょうか?

よろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

返信が遅くなってすみません。コードまで丁寧に記述していただいてありがとうございます。参考にさせていただきます。

お礼日時:2009/06/22 01:26

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 …

参考URL:http://msdn.microsoft.com/ja-jp/library/k4ftfkd2 …
    • good
    • 0
この回答へのお礼

返信が遅くなってすみません。本屋に行って、推薦いただいた本でもみてみます。ありがとうございます。

お礼日時:2009/06/22 01:27

>Visual C++を使い始めたばかりの初心者です。



う~ん、Borland C++ Builderだと
・読み込み用のTStringListを作る
・分解用のTStringListを別に作る
・作った読み込み用TStringListのLoadFromFile()メソッドでCSVファイルを読み込む
・TStringListのStrings[]プロパティで1行を取り出す
・分解用のTStringListのCommaTextプロパティに、取り出した1行を放り込む
・分解用のTStringListのStrings[]プロパティで、カンマで区切られ済みの項目を取り出す
という6ステップ書くだけで可能なんだけど。

ハンパに覚えてしまう前にVisual C++みたいな腐ったコンパイラは捨てて、Borland C++ Builderに乗り換えてみては?
    • good
    • 0
この回答へのお礼

違った角度からご回答いただきありがとうございます。

お礼日時:2009/06/19 01:42

正式なCSVの仕様では、文字列中に改行コードが含まれることもあるので、


そういったCSVをも処理するなら、一文字ずつ処理するほかになさそうです。

文字列中にカンマなどが含まれないなど、条件が限定できるなら、
fgets+sscanfが楽ですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参考にさせていただきます。

お礼日時:2009/06/19 01:42

ん~ お使いになっている 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を使うといった手法もありかと ・・・
    • good
    • 0
この回答へのお礼

素早いご回答ありがとうございます。
教えていただいた方法で色々と試してみようかと思います。

お礼日時:2009/06/19 01:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!