【发布时间】:2015-02-16 14:40:00
【问题描述】:
我正在寻求有关创建动态扩展数组以从 .csv 文件导入数据的帮助。我不想查看文件有多大并在源代码中编辑变量/提示用户,我只想导入数据然后以各种方式进行操作。首先,我的代码原样:
#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.012385657,-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”将在 eof 处设置为 0。
【问题讨论】:
-
使用
std::vector<T>和合适的类型T来保存元素并使用vector.push_back(value)附加每条记录。班级将根据需要照顾成长。 -
你能用向量展示你的代码吗?
-
你只使用第一列和第四列吗?如果是这样,您可以通过不将字符串转换为每行其他三个值的两倍来节省工作量。
-
@DietmarKühl 这就是我试图实现的,但没能做到。这将如何在 2D 中处理?
-
实际上
deque听起来很适合这个应用程序,正是因为你只是在末尾追加。
标签: c++ arrays vector heap-memory deque