Я пытаюсь написать программу, которая принимает файл 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 в исходном файле?
Чтобы помочь, вот снимок того, как данные организованы в файле
В std :: deque нет такой вещи как pop_back (int) …
чтобы получить доступ к первой ячейке столбца 24, вы должны написать (* this) [0] [23] — первый индекс — это индекс строки, так как вы вставили целую строку в свою деку deques, а второй индекс — индекс столбца.
или предпочтительно:
data_t table;
table.load("bla.csv");
//process table[0][23]
//...
или даже лучше: получить загрузку и сохранить функции-члены из структуры, и использоватьtypedef vector<vector<float>> table_t
— нет необходимости наследовать deque, vector или какой-либо контейнер … на самом деле, наследуя класс без виртуального деструктора, вы напрашиваетесь на неприятности. И ты скучаешь по инкапсуляция.
Если бы сохранение и загрузка были бесплатными шаблонными функциями, было бы возможно загрузить CSV-файл и контейнер и сэкономить вам время, если оно вам когда-нибудь понадобится.