Быстрый импорт из чисел, хранящихся в файле CSV


Я хотел бы эффективно импортировать действительные числа хранятся в формате CSV в массив. Есть ли способ, чтобы изменить мой код, чтобы сделать его быстрее? Также, есть ли способ сканировать файл и подсчитать количество строк и столбцов вместо того, чтобы обеспечить это напрямую?

double * getcsv(string fname, int m, int n){
    double *a;
    a = (double *)malloc(n * m * sizeof(double));

    ifstream fs(fname.c_str());   
    char buf[100];   

    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if (j < (n-1) ){
                fs.getline(buf,100,',');}
            else{           
                fs.getline(buf,100);}
            stringstream data(buf);
            data>>a[(i*n)+j];

         }
     }

     return(a);
}


10795
2
задан 19 мая 2011 в 08:05 Источник Поделиться
Комментарии
1 ответ


  • В C++, мы, как правило, избежать Танос - в этом случае можно использовать СТД::вектор< двойной > в земельном участке. Делая это, вы позволите пользователей вашего кода, чтобы использовать РАИИ вместо ручное управление выделенной памяти. Вы кал рассказать вектор, сколько выделить проинициализируйте его с правильным размером. Компилятор будет применять возвращаемое значение оптимизации, чтобы избежать копирования вектора (путем построения его в возвращаемое значение) так что вы не должны слишком беспокоиться об этом.

  • Вы не сохранить значения М и Н. Я не знаю, если это сделано намеренно, но если вы не хотите обременять свой клиентский код с таская его на себе, рассмотреть структуру или класс , чтобы носить его, и ценности ты читаешь, вокруг.

  • Вы не проверить возвращаемые значения методов, которые вы называете на fstream - вы должны.

  • Вы, наверное, лучше читать значения из fstream прямо на массив, а не читать их в буфер, копировать этот буфер в stringstream , а потом читать их из stringstream для преобразования. Вы можете сохранить использовать stringstream (и, следовательно, исключить его полностью).

Пример программы:

#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>

using namespace std;

struct Data
{
Data(unsigned int width, unsigned int height)
: width_(width)
, height_(height)
, data_(width * height)
{ /* no-op */ }
unsigned int width_;
unsigned int height_;
vector< double > data_;
};

Data split(istream &is, unsigned int width, unsigned int height)
{
Data retval(width, height);
double d;
int i(0);

while (is >> d)
{
retval.data_[i++] = d;
is.ignore(1, ',');
}

return retval;
}

int main()
{
const char *test_string = ""
"2.83, 31.26, 2354.3262, 0.83567\n"
"12.3, 35.236, 2854.3262, 0.83557\n"
"32.3, 33.26, 2564.3262, 0.83357\n"
"27.3, 3.2869, 2594.3262, 0.82357\n";
const unsigned int width = 4;
const unsigned int height = 4;
stringstream ss(test_string);
Data data(split(ss, width, height));
copy(data.data_.begin(), data.data_.end(), ostream_iterator< double >(cout, " "));
}

3
ответ дан 20 мая 2011 в 12:05 Источник Поделиться