2014-09-08 2 views
0

Я пытаюсь написать программу, которая принимает файл CSV в качестве входного файла, чтобы я мог изменять (выполнять вычисления) значения, которые присутствуют и выводить их снова в формате CSV с новыми значениями на нем.Импортируйте CSV-файл, отредактируйте его и выведите с измененными значениями

Структура, в которой хранятся значения, является двумерным вектором, поскольку она позволяет создавать большие файлы.

struct data_t: deque <deque <float> > 
{ 
    typedef deque <deque <float> > ::iterator record_iterator; 
    typedef deque  <float> ::iterator field_iterator; 
    bool load(const string& filename); 
    bool save(const string& filename); 
    bool save(ostream& outs); 
}; 

Данные загружены с помощью getline.

bool data_t::load(const string& filename) 
{ 
    string s; 
    ifstream f(filename.c_str()); 
    while (getline(f, s)) 
    { 
    deque <float> record; 
    istringstream iss(s); 
    while (getline(iss, s, ',')) 
    { 
     float fieldvalue = 0.0f; 
     istringstream(s) >> fieldvalue; 
     record.push_back(fieldvalue); 
    } 
    this->push_back(record); 
    } 
    return f.good(); 
} 

И данные сохраняются с помощью этих двух функций.

bool data_t::save(const string& filename) 
{ 
    ofstream f(filename.c_str()); 
    if (!f) return false; 

    return save(f); 
} 

bool data_t::save(ostream& outs) 
{ 
    for (data_t::record_iterator ri = this->begin(); ri != this->end(); ri++) 
    { 
    for (data_t::field_iterator fi = ri->begin(); fi != ri->end(); fi++) 
     outs << ((fi == ri->begin()) ? "" : ", ") << *fi; 
    outs << endl; 
    } 
    return outs.good(); 
} 

Теперь , прежде чем я выводить данные, Я пытаюсь создать функцию, которая принимает значения из определенных столбцов (колонны 24, 25 и 48, и 49, так как это CSV-файл в Excel формат - строки и столбцы) и выполняет несколько вычислений. По сути, мне нужно иметь доступ к определенным значениям.

Давайте просто попытаться выбрать одно значение из первой строки колонки 24. Если я использую pop_back, это может работать учитывая, что я толкнул значение со спины с помощью push_back при заполнении Deque при импорте в первую очередь , Это что-то вроде pop_back (23), так как оно начинается с 0? Будет ли это предоставлять значение, соответствующее строке 1, столбцу 24 в исходном файле?

Чтобы помочь, вот снимок того, как организованы данные в файле original csv file

+0

Используйте 'std :: vector' вместо' std :: deque' для доступа к произвольным столбцам. –

+0

@ πάνταῥεῖ deque позволяет случайный доступ, как вектор ... –

+0

@ Mr.WorshipMe Хорошо, я действительно не вижу причины, почему его использовать здесь. –

ответ

1

Там нет такого понятия, как pop_back (межд) в станд :: Deque ... , чтобы получить доступ к первая ячейка столбца 24, которую вы напишете (* this) [0] [23] - первым индексом является индекс строки, поскольку вы ввели целую строку в свой deque of deques, а второй индекс - индекс столбца.

или предпочтительно:

data_t table; 
table.load("bla.csv"); 
//process table[0][23] 
//... 

или даже лучше: получить нагрузку и сохранить функции-члены из структуры, и использовать typedef vector<vector<float>> table_t - нет необходимости наследовать или дека вектор или любой контейнер ... в факт, наследуя класс без виртуального деструктора, вы просите о неприятностях. И вам не хватает encapsulation.

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

+0

Pleease упоминает, что не наследует класс контейнера, а имеет управляемый его член. –

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