string型のvectorに格納されたデータを数値型に変換するには?

解決


miel  2006-10-17 07:44:24  No: 63337

数値データが保存されたcsvファイルをstring型のvectorへ格納後、
格納データを計算処理に扱いたいのですが、数値型へ型変換することができません。
csvファイルからの読み込みは以下のようにしています。
こちらの掲示板にあったログからお借りして見よう見まねで作ったものなので、お見苦しいところがあると思いますがよろしくお願いいたします。

//以下、c++ソース
#include <vector>
#include <iostream>
#include <string>
#define STR_MAX 256 /* 文字列入力用配列長 */
void main(void)
{
  using namespace std;
  vector< string > data;
  char buff[STR_MAX]; /* 文字列用 */
  int gyou=0;
  FILE *fp;
  
  /* ファイルを開けなかったらメッセージを出力 */
  if ((fp = fopen("documents.csv", "r")) == NULL)
  {
    printf(stderr, "Not Open!\n");
    exit (2);/* 終了 */
  }  
  /* ファイルから失敗するまで行単位で文字を読み込み */
  while ((fgets(buff, STR_MAX - 1, fp)) != NULL)
  {
    buff[strlen(buff) - 1] = '\0';  /* 余分な改行コードを削除 */
    const string str = buff;
    string::size_type s = 0;
    gyou=0;
    for( string::size_type e = str.find_first_of( ',' ); e != string::npos; e = str.find_first_of( ',', s ) )
    {
         data.push_back( str.substr( s, e - s ) );
         s = e + 1;
  gyou++;
    }
    data.push_back( str.substr( s ) );
    //出力
    for( vector< string >::size_type i; i < data.size(); ++i )
    {
       for(double ii=0;ii<data[i].size();ii++)
       {
          printf("%c",data[i][ii]);
       }
       printf("\n");
    }
    //出力ここまで
  }
}

/*csvファイルの内容*/
/*0.0013,1.05,0.0002,0.01,0.95,0.95,0.012,0.0012,0.98,0.58824,0.3887,*/


επιστημη  2006-10-17 07:58:35  No: 63338

> 数値型へ型変換することができません。

上記コードのどこで数値型へ型変換しているのでしょうか?


miel  2006-10-17 10:00:28  No: 63339

説明不足で申し訳ありません。
上に載せたコードでは数値型へは変換していません。
読み込みの段階で数値型に格納できれば一番良いのですが、方法が分からなかったためvector< string > dataへ格納しました。
このstring型で格納されたデータを数値型へ変換して、別の配列へ保存し直せないかと悩んでいます。

理想としては
0.0013  1.05
0.0002  0.01
0.95    0.012
0.0012  0.98
0.58824 0.3887
という風に二次元配列にすることなのですが、可能でしょうか?


επιστημη  2006-10-17 14:45:08  No: 63340

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int main() {

  std::string str = "0.0013,1.05,0.0002,0.01,0.95,0.95,0.012,0.0012,0.98,0.58824,0.3887,";

  // CSV -> vector<string>
  std::vector<std::string> data;
  std::string::size_type s = 0;
  for( std::string::size_type e = str.find_first_of( ',' ); 
       e != std::string::npos; 
       e = str.find_first_of( ',', s ) ) {
     data.push_back( str.substr( s, e - s ) );
     s = e + 1;
  }
 
  vector<string> -> vector<double>
  std::vector<double> numeric;
  for ( int i = 0; i < data.size(); ++i ) {
    std::istringstream stream(data[i]);
    double value;
    stream >> value;
    numeric.push_back(value);
  }

  // print 'em out.
  for ( int i = 0; i < numeric.size(); ++i ) {
    std::cout << numeric[i] << std::endl;
  }

  return 0; 

> という風に二次元配列にすることなのですが、可能でしょうか?

可能です。学習してください。


επιστημη  2006-10-17 14:46:32  No: 63341

上記のコード、一箇所バグ(コンパイル・エラー)があります。


επιστημη  2006-10-17 18:33:53  No: 63342

> 読み込みの段階で数値型に格納できれば一番良いのですが

了解。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <complex>

int main() {

  std::string input = "0.0013,1.05,0.0002,0.01,0.95,0.012,0.0012,0.98,0.58824 0.3887";

  std::replace(input.begin(), input.end(), ',', ' ');
  std::istringstream stream(input);
  std::vector< std::complex<double> > data;
  double real, imag;
  while ( stream >> real >> imag ) {
    data.push_back(std::complex<double>(real,imag));
  }
  for ( int i = 0; i < data.size(); ++i ) {
    std::cout << data[i] << std::endl;
  }

  return 0; 

/* 実行結果
(0.0013,1.05)
(0.0002,0.01)
(0.95,0.012)
(0.0012,0.98)
(0.58824,0.3887)
*/


miel  2006-10-20 07:59:02  No: 63343

お返事が遅れまして申し訳ありません。

επιστημηさん>
どうもありがとうございました。
作っていただいたソースを元に勉強を続けたいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加