1

csv ファイルから不明なサイズのフロートの大きなデータ ブロックを読み取るプログラムを作成しようとしている人が私に手を差し伸べてくれるかどうか疑問に思っていました。これは既に MATLAB で作成しましたが、これをコンパイルして配布したいので、c++ に移行します。

私はただ学んで、これを読んで始めようとしています

7,5,1989
2,4,2312

テキストファイルから。

これまでのコード。

// Read in CSV
//
// Alex Byasse

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <stdlib.h>

int main() {

    unsigned int number_of_lines = 0;
    FILE *infile = fopen("textread.csv", "r");
    int ch;
    int c = 0;
    bool tmp = true;
    while (EOF != (ch=getc(infile))){
      if(',' == ch){
    ++c;
      }
      if ('\n' == ch){
    if (tmp){
      int X = c;
      tmp = false;
    }
            ++number_of_lines;
    }
    }
    fclose(infile);

  std::ifstream file( "textread.csv" );

  if(!file){
    std:cerr << "Failed to open File\n";
    return 1;
  }

  const int ROWS = X;
  const int COLS = number_of_lines;
  const int BUFFSIZE = 100;
  int array[ROWS][COLS];
  char buff[BUFFSIZE];
  std::string line; 
  int col = 0;
  int row = 0;
  while( std::getline( file, line ) )
  {
    std::istringstream iss( line );
    std::string result;
    while( std::getline( iss, result, ',' ) )
      {
        array[row][col] = atoi( result.c_str() );
        std::cout << result << std::endl;
        std::cout << "column " << col << std::endl;
        std::cout << "row " << row << std::endl;
        col = col+1;
    if (col == COLS){
    std:cerr << "Went over number of columns " << COLS;
    }
      }
    row = row+1;
    if (row == ROWS){
      std::cerr << "Went over length of ROWS " << ROWS;
    }
    col = 0;
  }
  return 0;
}

私が使用している私のmatlabコードは>>

fid = fopen(twoDM,'r');

s = textscan(fid,'%s','Delimiter','\n');
s = s{1};
s_e3t = s(strncmp('E3T',s,3));
s_e4q = s(strncmp('E4Q',s,3));
s_nd = s(strncmp('ND',s,2));

[~,cell_num_t,node1_t,node2_t,node3_t,mat] = strread([s_e3t{:}],'%s %u %u %u %u %u');
node4_t = node1_t;
e3t = [node1_t,node2_t,node3_t,node4_t];
[~,cell_num_q,node1_q,node2_q,node3_q,node_4_q,~] = strread([s_e4q{:}],'%s %u %u %u %u %u %u');
e4q = [node1_q,node2_q,node3_q,node_4_q];
[~,~,node_X,node_Y,~] = strread([s_nd{:}],'%s %u %f %f %f');

cell_id = [cell_num_t;cell_num_q];
[~,i] = sort(cell_id,1,'ascend');

cell_node = [e3t;e4q];
cell_node = cell_node(i,:);

どんな助けでも感謝します。アレックス

4

4 に答える 4

0

これは、Dietmar Kuhl のソリューションを編集することを意図していましたが、編集が大きすぎるため拒否されました...

Matlab を C++ に変換する通常の理由は、パフォーマンスです。そこで、これら 2 つのソリューションのベンチマークを行いました。次のオプション「-Wall -Wextra -std=c++0x -O3 -fwhole-program」を使用して、cygwin 用の G++ 4.7.3 でコンパイルしました。32 ビット Intel Atom N550 でテストしました。

入力として、2 つの 10,000 行のファイルを使用しました。最初のファイルは 1 行あたり 10 個の "0.0" 値で、2 番目のファイルは 1 行あたり 100 個の "0.0" 値です。

time を使用してコマンド ラインから時間を計り、3 回の実行で user+sys の合計の平均を使用しました。

最初のプログラムと同じように、2 番目のプログラムから読み取るように変更しstd::cinました。

最後に、テストを再度実行しましたstd::cin.sync_with_stdio(false);

結果 (秒単位の時間):

               sync                no sync
        10/line  100/line     10/line  100/line
prog A    1.839    16.873       0.721     6.228
prog B    1.741    16.098       0.721     5.563

明らかな結論として、バージョン B の方がわずかに高速ですが、さらに重要なことは、stdio との同期を無効にする必要があるということです。

于 2013-09-16T04:19:29.747 に答える