• 締切済み

csv読込でVectorに格納した数値を分類したい

C++について2回目の質問となります。 私、現在CSVファイルの値を取得するコードを書いています。 後々、この値をある計算に使う予定です。 そこで、計算に使う際に使いやすいように分類しながら値を変数に格納したいと考えてます。 CSV1行を分割後にVectorに格納しようと考えています。 このVectorの型に構造体を入れることってできるのでしょうか。 1行を分類したいという意図がありまして、Vector<struct ***>とできないかと思っているのですが、 これは有効なのかがわかりません。 当初は、Vector<int>にするか、Vectorを2次元配列にしてCSVデータを入れていき、計算のときに何番目(何列目)を取り出す、というやりかたにしようと考えていたのですが、分類の仕方は決まりきっているので、分類ごとに構造体を用意し、Vector<struct ***>に順番に入れていく、というやり方を思いつきました。 が、1行を一旦Vector<int>に入れてしまって、あとで必要なところを要素指定したほうがいいのではとまた思い直し、混乱が起こっています。 Vector<struct ***>ということはできるのか、という点、 Vector<int>にして、あとで構造体(変数?)にいれるべきなのか、という点、 または、Vectorに入れるべきではないのか(構造体に入れるならば、リストにすべきか)という点を教えていただけないでしょうか。 わかりにくいようでしたら、随時ご指摘お願いします。 すみません、C++初心者なので、もしかしたらとんでもないことをいっているかもしれませんが、有識者の方、アドバイスをお願いします。

みんなの回答

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

……あれ? ごめんなさい、私が想像していたこととちょっと違ってきたのですこし戸惑ってしまいました。 すみませんが、CSVの1行にどんな値が並んでいて、その1行をどう処理して、CSV全体としてはどんな処理がしたいのかを書いていただけないでしょうか。 > あと、別件になってしまうのですが、 > vector<vector<int>>という形の意味は、「1行分を列単位」格納できる、 > ということで合っていまでしょうか。 ノー。 以下の3つの理由で問題があります。 1. CSVには数値だけでなく文字列も並べることができ、数値も整数とは限らない。 2. 並んでいるのが整数だけとしても、その各列には何らかの意味があるはずなのにその意味を無視している。 3. 上記2つに目をつぶるとしても、この形式は「『1行分』をCSVの行数分」という意味のほうが自然である。

paburonnn26
質問者

お礼

お返事ありがとうございました。 PCの故障とネットの関係でお返事ができませんでした。 大変申し訳ありませんでした。 csv1行は全て数値でintで扱えるものです。 csvの値は各々の値を計算に使います。 すみません、私の誤記だったのですが、vector<vector<int>>は1行分を行数分ですね。

回答No.2

大丈夫でしょうか、って聞く前に、自分で試したほうが早いよ。 この程度のことなら。

paburonnn26
質問者

お礼

お返事ありがとうございました。 確かにそうですね・・・大変失礼しました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> Vector<struct ***>ということはできるのか 大丈夫、できます。 > Vector<int>にして、あとで構造体(変数?)にいれるべきなのか これに関してはCSVの「列」に対して処理を行うという特別な場合を除いてやる必要は無いと思います。 # 列の総和とか前行同列との差分とかの単純な場合でも必要ない > または、Vectorに入れるべきではないのか(構造体に入れるならば、リストにすべきか) たしかに構造体ならばlistのほうが効率的かな?ただし、listでは各要素へのランダムアクセスはできません。ランダムアクセスが必要ならばvectorを使うべきでしょう。 あと、Vectorではなくvectorだし、C++では構造体を宣言するとき以外はstructは不要です(C言語でtypedefを使わないならば必要ですが)。つまり、 > Vector<struct ***> は  vector<***> に……って、*に意味があるC/C++では分かりづらいか。 ようするに、  struct Hoge {};  Hoge fuga; // C言語ならNG, C++ならOK  vector<struct Hoge> foo; // これは……  vector<Hoge> bar; // これと同じ意味になる ってことですね。

paburonnn26
質問者

お礼

早急なお返事ありがとうございます。 大変参考になりました。 vector<***>の***には構造体が入れられるのですね。 構造体で入れられるなら、格納の時点で分類ができるから、 あとで位置指定して、ある要素を取得する、ということが必要なくなり、 listの方が効率がいいかと思いました。 ですが、私が***に入れたい構造体は、以下のような形ですが、大丈夫なのでしょうか。 例: typedef struct{ int max; int ave; }first; typedef struct{ first a; second a; }AAA; struct{ AAA aaa; BBB bbb; }AB;  ※Bも同様にAと同様に定義する。 vector<AB> 1種類の構造体ならできそうですが、上記の例で言うと、 ABのAAAのfirst,second,max,ave の順 ABのBBBのfirst,second,max,ave の順 で格納したい。 これってvector<***>にしてうまく順番に入れることができるのでしょうか。 あと、別件になってしまうのですが、 vector<vector<int>>という形の意味は、「1行分を列単位」格納できる、 ということで合っていまでしょうか。

関連するQ&A

  • CSVファイルを読み込んで計算するには、構造体か?

    はじめまして。C++プログラミングの質問です。 初心者レベルの質問で申し訳ないのですが、お付き合いください。 CSVファイルを読み込んで、書かれている値を使ってある計算を行う、 ということをしたいのですが、処理方法をどうするか悩んでいます。 CSVファイルに書かれる最大行86400行、最大列6000列です。 また、開発環境はLinuxとなります。 私は「CSVファイルの項目を構造体に格納するクラス」と、「構造体の値を使って計算 するクラス」を考えました。 しかし、構造体ですと最大86400行のものを格納するのは、メモリを食うだけで無駄だという 指摘を受けました。 直接ファイルから値をとってきて、計算クラスに処理させるほうが無難と言われましたが、 「CSVファイルの項目を構造体に格納するクラス=データベース」と考えており、 後々拡張する場合に融通が利くのではないでしょうか。 経験が浅いので、断固たる主張ができないのですが・・・ 構造体に入れることばかり考えていたので、開発のボリュームを抑え、かつ、メモリを食わない 方法を全く思いつきません。 有識者の方へアドバイスを受けたいのですが、 ・大量のデータを読み込む場合、構造体等に格納する方が後ほど助かるか、 それとも、直接ファイル読み込みした方がよいか ・構造体格納のほかに相応しいやり方はないか この2点をメインにお答えいただけないでしょうか。 何か良いやりかたがありましたら教えていただきたいです。 よろしくお願い致します。

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • CSV ⇒ 構造体 ⇒ 文字列配列

    1,あいうえおあいうえお 3,かきくけこ 2,さしすせそさしすせそさしすせそ 3,たちつてと 2,なにぬねの 1,はひふへほはひふへほはひふへほはひふへほ    ・    ・    ・ といったようなCSVファイルがあります。 まずは、それを typedef struct tagSetInf{  int nPattern; // 1or2or3  char szSearch[256]; // 文字列:最大255バイト }SetInf; という構造体に格納していき、そのszSearchの値を nPatternの値に応じて3種類の文字列配列((例)search1,search2,search3)に 格納したいと思っています。 CSVのレコード数は可変です。(たぶん最大数は100くらいだとは思うのですが・・・) 以上の実現方法を教えてください。よろしくお願いいたします。 環境:Win32 API、C/C++。

  • Csvから1行ずつ変数に格納するには;

    いつもお世話になっています。 次のようなcsvファイルがあります。 会員番号,パスワード,データ1,データ2,データ3 1234567,1111,1970/1/1,1990/4/1,A 1111111,1,1960/1/1,1985/4/1,AB ・ ・ ・ このcsvファイルをExcelのVBAで次のようなコードで読みとろうとしています。 Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFile("csvファイル名") Set ts = f.OpenAsTextStream(1, -2) ssk = ts.readline readlineは1行だけ読み込むと覚えているのですが、なぜか変数sskにはすべての行が連結された状態で格納されてしまいます。 2回目以降のreadlineでは「ファイルにこれ以上データがありません。」と出ます。何か根本的に間違っているのでしょうか;; このようなcsvファイルを、正しく1行ずつ変数に格納する方法にはどのようなものがありますでしょうか。 よろしくお願いします。

  • VB.NETでのCSVファイルの読込

    VB.NETでCSVファイルを1行ずつ読込んで 取得できた値を格納するロジックが分かりません・・・ 申し訳ありませんが、どなたか教えて頂けないでしょうか???

  • findContoursの格納データ(点ベクトル?

    こんにちは スキルが無いので資料見ながら苦労しています。 まずやりたいことは, キネクト等で取得した物体断面画像(長方形物体,傾き有り)の最大長さと幅を取得することです。 opencvのサンプルプログラム (1)「Square」の”findContours”で輪郭抽出を, (2)「minarea」の”minAreaRect”で輪郭点群を内包する長方形取得 と考えたのですが, 格納変数が (1)はvector<vector<Point>> (2)はvector<Point> ということでそのままはつかえません。(・・・よね?・・・) (2)は単純にXYの座標データですが, (1)は2次元配列で「 検出された輪郭.各輪郭は,点のベクトルとして格納されます.」 とOpenCV 2.2 C++ リファレンスにはありました。 点ベクトルで格納されていると言うことが今ひとつ理解できずにいます。2次元配列の ・1番目の要素は何か? ・2番目の要素は何か? ・格納されているx,yは何か? わかりやすく解説して頂けると助かります。 併せて, ・上記を実現するためにvector<vector<Point>>をvector<Point>にうまく変換する方法 ・他に良い方法があるよ とかありましたらお願いします。

  • C言語:構造体、自作関数についての質問

    こんばんは C言語の問題を提示されてなんとか作成していますが構造体と自作関数の変数の値を返したりするのが上手くいきません。 問題 「(1)x座標およびy座標のペアとして構成される構造体pointを定義せよ(両座標は整数であるとする)  (2)x座標およびy座標のメンバに値を設定し、その構造体を返す関数  struct point pointof(int a,int b){………}を作成せよ。  (3)二つの座標a,b間の距離を計算する関数  double distanceod(struct point a,struct point b); を作成せよ。  ※sqrt関数を使用せよ」 という問題です。メンバについてもいまいちよくわかりません。 どこでintを使うのか、またmainに値を返すやり方も上手くいかずコマンドプロンプトにはねられてばかりです。 どなたか解説おねがいしますm(_ _)m

  • C++でSTLのVectorを使った構造体について

    Vectorで作った構造体配列a内でさらにVectorで宣言された配列bを作った場合、bに数値を代入するにはどうすれば良いのでしょうか? struct A {  std::vector<int> b; }; std::vector<A> a;

  • CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後

    CSVファイルを読み込み構造体のメンバ、"value"に格納し、その後平均値を求めて構造体のメンバ、"ave"に格納し表示させたいのですが、読み込み格納している最中で、セグメンテーション違反で終了してしまいます。どなたかよろしければ教えて頂けないでしょうか。 プログラム ************************************************** #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME_00 "f_00_01.CSV" struct Data{ double value; double ave; }; int main(int argc, char *argv[]) { FILE* fp,*fo; // ファイルポインタ用 int n, i, file_size; struct Data *dat; if ((fp = fopen(FILE_NAME_00,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; for(i=0;i<file_size;i++){ fscanf(fp,"%lf",&dat[i].value); printf("%lf\n",dat[i].value); i++; } fclose(fp); printf("\n"); free(dat); return 0; } *************************************************** f_00_01.CSV *************************************************** 2.313725 2.312810 2.314031 2.316167 2.315557 2.313725 . . . . . ***********************************************

  • ベクターの初歩について

    ベクターについて勉強し始めた所です。ベクターについて解らない事があるので教えて下さい。 今ベクターに10個数字を登録します。 後で3か5があれば取り除きます。 #include <vector> #include <iostream> int main(){   using namespace std;   vector<int> array1;   for( int i = 0; i < 10; ++i )     array1.push_back( i );   vector<int>::iterator it;   for(it = array1.begin(); it != array1.end(); ){     if(*it == 3 || *it==5)       it = array1.erase(it);     else       ++it;   }   for( it = array1.begin(); it != array1.end(); ++it )     cout << *it << endl;   return 0; } 一応出来たんですが、これが構造体だったらどうしたらいいのでしょう? typedef struct{   int x,y; }xy_t; vector<xy_t> array1; だとして、最初にx,yのそれぞれ10個に適当な値を入れておき、xが3か5ならそれを削除するにはどうしたらいいのでしょうか。 また、一つずつ削除する方法と、remove関数で出来そうな気がするので、もし一括で出来る方法があればそちらも2種類お願いします。 (構造体を用いたベクターの使い方が書いてある参考サイトでも結構です) XP Pro VS2005Pro よろしくお願いします。