• ベストアンサー

Visual C++によるcsvファイルの読み込みについて

Quantの回答

  • ベストアンサー
  • Quant
  • ベストアンサー率18% (23/122)
回答No.4

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

t09dk1
質問者

お礼

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

関連するQ&A

  • C言語 CSVファイルの読み込み

    C言語でCSVファイルから数字を読み込み、それを計算するというプログラムを作りたいのですが、CSVファイルについて全く知識が無く、加えてCSVファイルを利用したプログラムを作るのが初めての為、勝手がわかりません。 まずCSVファイルというのは、 1.2,2.3,3.4 4.5,5.6,6.7 7.8,8.9,9.0 といった数字(文字列)をカンマで区切ったテキストファイルですよね? それをどのようなプログラムで読み込むのでしょうか? 例えば、上記の数字を読み込み、 a. 1.2+4.5+7.8=x b. 8.9-5.6-2.3=y c. 3.4*6.7*9.0=z と計算する場合のプログラムを教えていただきたいです。 よろしくお願いします。

  • csvファイルからの読み込みがスムーズにできません

    fscanfでCSVファイルから文字列を取り込み、カンマ区切りで4つの変数に文字列を代入しようと考えているのですが、出力されたcsvファイルが変わった区切りかたをしているのでうまく変数に代入できずに困っております。 例えば、出力されたcsvファイルは以下のようになっております "ABC CO.,I","4540",""STAR"","2010/03/31" 希望としては aにABC CO.,I bに4540 cにSTAR dに2010/03/31 をそれぞれ代入したいのですが aに入る文字列にはCO.,Iというようにカンマが既にありますので カンマ区切りで読み込むとめちゃくちゃになってしまいます ですので基準をダブルクオーテーションに置き、"と"の間の文字列を代入というような形が取れれば良いのですが、このような方法での文字列取得は可能でしょうか? c言語の勉強を始めて間もない為、低レベルな質問、表現であることをお許し下さい。 よろしくお願いします。

  • c#で(",")区切りのcsvファイルから読み込みを行うには?

    駆け出しの初心者です。 以前c言語を少々勉強していてcsvファイルの読み込み、書き出しを練習していたのですが、最近c#を使うようになり、その便利さに圧倒されております。 今回c#で読み込みたいcsvファイルは以下のようになっております "abc","123","あいうえお" ただのカンマ区切りであれば読み込みは簡単ですが、 上記のようにダブルクオーテーションでそれぞれの文字列が囲まれている場合に文字列だけを読み込み、配列に代入していくのに何かスムーズな方法はありませんでしょうか? ちなみに現在単純にカンマ区切りのcsvファイルを読み込むコードを 書いた所ですので、載せておきます これをいじってスムーズにいければうれしいのですが、いかがでしょうか? private void LoadData() { string path = "Data.csv"; string delimStr = ",";//区切り文字 char[] delimiter = delimStr.ToCharArray(); string[] strData;//分解後の文字用変数 string strLine;//1行分のデータ Boolean fileExists = System.IO.File.Exists(path); if (fileExists) { System.IO.StreamReader sr = new System.IO.StreamReader( path, System.Text.Encoding.Default); while (sr.Peek() >= 0) { strLine = sr.ReadLine(); strData = strLine.Split(delimiter); DataSet.DataTable.AddDataTableRow( DateTime.Parse(strData[0]), strData[1],    strData[2], int.Parse(strData[3]), strData[4]); } sr.Close(); } } いつも丁寧な回答で協力してくれる皆様には心から感謝しております。 どうぞよろしくお願いします。

  • CSVファイルの中身を操作したいけど何の言語がいいのでしょうか

    驚くべきCSVファイルがあります。100MBとか。たぶん、行が何十万行となるんでしょう。エクセルでは開ききれず6万5千行くらいまで開かれて残りは見れませんでした。 このCSVファイルを操作したいのです。CSVファイルはコンマ区切りのファイルですが、例えば 1,1,3 2,2,1 1,1,2 1,2,1 こんな内容だったとして、二番目の数字が2の場合の行のみをコピーして別の新しいCSVファイルが作りたいのです。 こういう操作はどんな言語で可能なのでしょうか。簡単に書けるのでしょうか。 私が持っているもので使える環境があるのは、C言語、MicrosoftのVisual BasicとVisual C++? です。Javaもあったような。 あと、気になってるのはMatlabです。

  • CSVファイルの読み込み

    お世話になります。 VBAでCSVファイルを読み込んで処理をしたいのですが、 たとえば下記のようなCSVファイルの場合 2つめの項目が金額セットされており、あらかじめ通貨編集(カンマ編集) がされていて 金額を1つの項目として読み込む事が出来ません。 金額は""でくくってあるのですが、 カンマ区切りのデータと""でくくってあるデータを うまく区別して3つの項目をそれぞれ抽出する事は可能でしょうか? -----以下CSVの内容------ 日付,金額,データ 2007/03/09,"1,200",TEST1 2007/03/09,"12,200",TEST2 2007/03/09,"76,00",TEST3 2007/03/09,"4,5600",TEST4 --------------------------- ちなみに現在はこのようにカンマ区切り指定でデータを抽出してるので うまく出来ません。   'FileNameにはオープンするファイル名がセットされています   Open FileName For Input As   'textlineに1行を読み込む   Line Input #ch1, textline   csvline() = Split(textline, ",") VBAがまだ不慣れな為質問やサンプルが分かりずらいと思いますが よろしくお願いします。

  • CSVファイルの読み込み

    使用ソフト:Microsoft Visual Basic 2005 Express Edition csvファイル(カンマ区切り)で一列目(aaaの部分)を表すにはどうしたらよいのでしょうか? aaa,bbb,ccc

  • Excel VBAにてCSVファイルを読みたい

    ExcelにてCSVファイルを読んで処理をしたい。 ただし、CSVファイルをExcelでopenすると遅いので、 VBAにてファイルとして読み込みで処理をしたいのですが、 皆さんは、どのように行っていますか? ※CSVファイルは、テキスト区切り→"(ダブルコーテーション)です  テキスト区切り無しであれば、1行読んで、カンマをsplitすれば良いと思いますが。。。。

  • csvファイルでの,(カンマ)の取扱について

    csvファイルをperlで取扱っています。 ,(カンマ)が含まれるデータは""で括ってやれば行がずれることなく入るのは分かっているのですが、今度は取り出すときどのようにしていいのか分かりません。 各行毎に一連のデータが羅列されていますが、それの分割方法を教えてください。 たとえば、 $bに,(カンマ)入りの文字列が入っていた場合、 ($a, $b, $c) = split(/,/, $query); とすると本来$bに入って欲しいデータの,(カンマ)から後の部分が$cに格納されてしまいます。(そこから先が1つずれます) これをずれずに分割させるにはどのようにしたらいいでしょうか? ちなみに ($a, "$b", $c) = split(/,/, $query); と試しにやってみましたが、エラーになってしまいました。 実は長年の悩みで、データを格納する際に,(カンマ)を別のあり得ないような文字列に置き換えて、取り出したあと,(カンマ)に戻すというやり方でやっていたのですが、1つのデータファイルを複数のperlで取扱うようになり、対応が難しくなってきたので、これを機にきちんとした方法でデータを取扱いたいと思っています。

    • ベストアンサー
    • Perl
  • C++でのcsvファイル読み込みについて

    C++でのcsvファイル読み込みについて質問です. 読み込みcsvファイルの規模は300*1000として,その情報をdouble型の2次元配列に格納したいですが,ネットでいろいろ調べたり自分でコードを作ってみてもabort()has been calledなどいくつかエラーが表示されてしまい先に進めません. csvファイル名をa.csv,格納したい2次元配列をA[300][1000]などとしてサンプルコードを提供してくださいますと幸いです. 質問前に散々調べましたがプログラミング初心者でして今現在の力では対応できませんでした.申し訳ありませんが何卒ご教示お願いします.

  • 文字として, "を使用するCSVファイルの取り扱い

    題名の通り、文字として,(カンマ)、"(ダブルクォート)を使用するCSVファイルの取り扱いについて教えて頂きたいです。 読み込むCSVファイルの形式は以下の通りです。 ・項目の最初と最後には"が設定される ・項目内の,は文字として扱う 例:"5,000" 5の後の,は項目内に設定されている為、文字として扱う ・項目内に"を設定する場合は""と設定する ・レコードは改行コード単位 例:"A","5,000","B","C""D""" 1項目目:"A" 2項目目:"5,000" 3項目目:"B" 4項目目:"C""D""" 上記の様なCSVファイルを読み込み、項目を取得するにはC言語ではどの様に対応するべきでしょうか。 下記方法で対応出来そうですが、効率が非常に悪いと思われます。 (1)fgetsにて1行分のレコードを読み込む。 (2)取得したレコードに対して、カンマを指定してstrtokを実行し、,間の値を取得する。 (3)取得したカンマ間の項目のダブルクォートの数をカウントする。 (4)-1カウント数が偶数の場合 ,を区切り文字とし、取得した値を1項目として扱う。 (4)-2カウント数が奇数の場合 ,を文字とし、次のカンマ間の項目を取得し、連結する。 連結した値のダブルクォート数をカウントし、カウント数が奇数か偶数か判定する。 (5)上記処理をstrtok結果がNULLになるまで繰り返し、NULLが帰ってきたら次の行のレコードを読み込む。 (6)上記処理をEOFまで繰り返す。 以上、よろしくお願いします。