2014-11-18 4 views
1

Я читаю в CSV, который имеет 3 столбца. В каждом столбце мне нужно выполнить вычисления среднего, var и std. Я могу получить вывод для первого столбца, но не знаю, как его распечатать все 3 столбца. Благодарю.C++ с библиотекой Boost. Чтение столбцов. Excel/CSV

Я пытался добавить '' после строки в время (GetLine (inNew, линии, ''))
но не работает для меня

int main() 
{ 
    ifstream inNew("C:/Users/A.csv"); 
    accumulator_set<double, stats<tag::mean, tag::variance >> acc; 
    if (inNew) 
    { 
     string line; 
     while (getline(inNew, line)) 
     { 
      acc(stod(line)); 
     } 
     cout << "Expected return is: " << mean(acc) << std::endl; 
     cout << "Variance: " << variance(acc) << std::endl; 
     cout << "Std Dev: " << sqrt(variance(acc)) << std::endl; 
    } 

    inNew.close(); 

    system("pause"); 
    return 0; 
} 

ответ

1

Поскольку вы уже используете boost, используйте boost::split, чтобы разделить каждую строку на свои столбцы. Затем накапливайте каждый столбец отдельно. Для каждого столбца вам понадобится accumulator_set.

код может выглядеть примерно так:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <vector> 

#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics/stats.hpp> 
#include <boost/accumulators/statistics/mean.hpp> 
#include <boost/accumulators/statistics/variance.hpp> 
#include <boost/algorithm/string.hpp> 

int main() 
{ 
    using namespace std; 
    using namespace boost; 
    using namespace boost::accumulators; 

    ifstream inNew("C:/Users/A.csv"); 
    size_t columns = 3; 
    vector<accumulator_set<double, stats<tag::mean, tag::variance>>> acc(columns); 

    if (inNew) 
    { 
     string line; 
     while (getline(inNew, line)) 
     { 
      vector<string> strs; 
      split(strs, line, is_any_of("\t ,")); 
      if (strs.size() == columns) 
      { 
       for (size_t i = 0; i < columns; ++i) 
       { 
        acc[i](stod(strs[i])); 
       } 
      } 
     } 

     for (size_t i = 0; i < columns; ++i) 
     { 
      cout << "Stats for column " << (i + 1) << endl; 
      cout << "Expected return is: " << mean(acc[i]) << endl; 
      cout << "Variance: " << variance(acc[i]) << endl; 
      cout << "Std Dev: " << sqrt(variance(acc[i])) << endl; 
     } 
    } 

    inNew.close(); 

    system("pause"); 
    return 0; 
} 

Конечно, вы могли бы сделать это более причудливый и надежный, не жестко прописывать количество столбцов.

+0

+1 Ты сделал то, что я сделал бы, только с Духом. Ну, я прощаю тебя :) – sehe

+0

Но здесь более динамично использовать Boost Spirit ** [Live On Coliru] (http://coliru.stacked-crooked.com/a/f03e959c2aa1d5da) **. См. [Как разобрать csv с помощью boost :: spirit] (http://stackoverflow.com/questions/18365463/how-to-parse-csv-using-boostspirit/18366335#18366335) для более продвинутой поддержки CSV – sehe

+0

При попытке IceSlicer кода, VisualStudio дает ошибку. Почему? Ошибка ошибка C4996: 'std :: _ Copy_impl': вызов функции с параметрами, которые могут быть небезопасными - этот вызов зависит от вызывающего, чтобы проверить правильность переданных значений. Чтобы отключить это предупреждение, используйте -D_SCL_SECURE_NO_WARNINGS. См. Документацию по использованию Visual C++ «Проверенные итераторы» \t c: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility – user2942358

Смежные вопросы