Я ищу помощь в создании динамически расширяющегося массива для импорта данных из CSV-файла. Я не хочу видеть, насколько велик файл и редактировать переменную в исходном коде/приглашать пользователя, я просто хочу, чтобы данные были импортированы, а затем обрабатывались различными способами. Во-первых, мой код as-is:Что такое хороший способ динамического расширения массива для импорта данных?
#include <fstream>
#include <sstream>
#include <iostream>
int main()
{
//declare variables and arrays
long rows = 170260;
int cols = 5;
double **rawData = new double*[rows]; //on heap because of size
for(long pi = 0; pi < rows; ++pi) //create an array of pointers
{
rawData[pi] = new double[cols];
}
char buff[200];
double deltaT;
double carDeltaV;
double *carV = new double[rows]; //on heap because of size
//import raw data
std::cout << "Importing filedata.csv...";
std::ifstream rawInput("filedata.csv");
for(long r = 0; r < rows; ++r)
{
rawInput.getline(buff, 200);
std::stringstream ss(buff);
for(int c = 0; c < cols; ++c)
{
ss.getline(buff, 40, ',');
rawData[r][c] = atof(buff);
}
}
std::cout << "Done." << std::endl;
//create speed matrix
carV[0] = 0;
std::cout << std::endl << "Creating speed matrix...";
for (long i = 1; i < rows; ++i)
{
deltaT = rawData[i][0] - rawData[i-1][0];
carDeltaV = rawData[i-1][3] * deltaT;
carV[i] = carDeltaV + carV[i-1];
}
std::cout << "Done." << std::endl;
//write data to csv file
std::cout << std::endl << "Writing data to file...";
std::ofstream outputData;
outputData.open("outputdata.csv");
for(long r = 0; r < rows; ++r)
{
outputData << rawData[r][0] << "," << rawData[r][3]/.00981 << ",";
outputData << carV[r] << std::endl;
}
outputData.close();
std::cout << "Done." << std::endl;
//delete pointers
std::cout << std::endl << "Clearing memory...";
for(long pj = 0; pj < rows; ++pj)
{
delete [] rawData[pj];
}
delete [] rawData;
delete [] carV;
std::cout << "Done." << std::endl;
std::cin.get();
return 0;
}
Примечание: количество колонок всегда будет 5. Строки неизвестны. Пример того, что я буду импортировать можно увидеть ниже:
0.001098633,0.011430004,0.002829004,-0.004371409,0.00162947
0.001220703,0.00606778,0.001273052,0.003497127,0.002359922
0.001342773,0.003104446,-0.000848701,0.,-0.008119254
Существует больше к этому, но это должно быть достаточно, чтобы понять, что я пытаюсь сделать. Я немного почитал на векторах, но концепция вектора-векторов немного сбивает меня с толку, и я попытался реализовать ее без успеха. Кроме того, я читал, что дека может быть тем, что я ищу? У меня нет опыта с ними, и мне кажется, что это может быть излишним для моего приложения, поскольку я только добавляю в одном направлении массив данных.
Отказ от ответственности: Я в значительной степени новичок на C++, поэтому, если есть какие-либо концепции, которые, по вашему мнению, будут выше моего уровня мастерства, пожалуйста, дайте мне знать, чтобы я мог прочитать об этом.
Любые советы?
Редактировать: По запросу, вот как я пытался сделать это с помощью векторов.
std::vector<double> rawDataRow;
std::vector< std::vector<double> > rawDataMatrix;
//import raw data loop
std::ifstream rawInput("test.csv");
for(int i = 1; i > 0;) {
rawInput.getline(buff, 200);
std::stringstream ss(buff);
for(int c = 0; c < cols; ++c) {
ss.getline(buff, 40, ',');
value = atof(buff);
rawDataRow.push_back(value);
std::cout << rawDataRow[0] << std::endl;
}
timeDiff = timeAfter - timeBefore;
timeBefore = timeAfter;
timeAfter = rawDataRow[0];
rawDataMatrix.push_back(rawDataRow);
}
где «i» будет установлено равным 0 на уровне eof.
Используйте 'зОго :: вектора' с подходящим типом 'T', чтобы удерживать элементы и использовать' vector.push_back (значение) 'для добавления каждой записи. Класс позаботится о росте по мере необходимости. –
Вы можете показать свой код в векторе? –
Вы используете только первый и четвертый столбцы? Если это так, вы можете сэкономить усилия, не преобразовывая строку, чтобы удвоить остальные три значения в строке. –