【发布时间】:2019-10-22 01:05:13
【问题描述】:
我正在尝试从 .csv 文件中读取特定值(即 values@coordinate XY),并努力寻找在该 .csv 中定义多维数组的正确方法。
这是我的 .csv 文件中的表单示例
NaN,NaN,1.23,2.34,9.99
1.23,NaN,2.34,3.45,NaN
NaN,NaN,1.23,2.34,9.99
1.23,NaN,2.34,3.45,NaN
1.23,NaN,2.34,3.45,NaN
NaN,NaN,1.23,2.34,9.99
1.23,NaN,2.34,3.45,NaN
NaN,NaN,1.23,2.34,9.99
1.23,NaN,2.34,3.45,NaN
1.23,NaN,2.34,3.45,NaN
NaN,NaN,1.23,2.34,9.99
1.23,NaN,2.34,3.45,NaN
NaN,NaN,1.23,2.34,9.99
1.23,NaN,2.34,3.45,NaN
1.23,NaN,2.34,3.45,NaN
...
好的,实际上,这个文件变得非常大。您可以解释行=纬度和列=经度,因此每个块都是每小时测量的坐标图。这些块通常具有行[361] 列[720] 的大小,时间段可以长达 20 年(=24*365*20 块),只是为了让您了解数据大小。
为了构建它,我想扫描 .csv 并将每个块定义为一个向量 t,我可以通过选择所需的时间步长 t=0,1,2,3...来访问它...
然后,在此块中,我想转到特定线(即纬度)并将其定义为向量 longitudeArray。
结果应该是在时间 Z 坐标 XY 的指定值。
正如您可能猜到的,我的编码经验相当有限,这就是为什么我的实际问题可能非常简单:如何排列我的向量以便能够调用任何随机值?
这是我目前的代码(遗憾的是它并不多,因为我不知道如何继续......)
#include <fstream>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int longitude, latitude; //Coordinates used to specify desired value
int t; //Each array is associated to a specific time t=0,1,2,3... (corresponds to hourly measured data)
string value;
vector<string> t; //Vector of each block
vector<string> longitudeArray; //Line of array, i.e. latitude
ifstream file("swh.csv"); //Open file
if (!file.is_open()) //Check if file is opened, if not
print "File could..."
{
cout << "File could not open..." << endl;
return 1;
}
while (getline(file, latitude, latitude.empty())) //Scan .csv (vertically) and delimit every time a white line occurs
{
longitudeArray.clear();
stringstream ss(latitude);
while(getline(ss,value,',') //Breaks line into comma delimited fields //Specify line number (i.e. int latitude) here??
{
latitudeArray.push_back(value); //Adds each field to the 1D array //Horizontal vector, i.e. latitude
}
t.push_back(/*BLOCK*/) //Adds each block to a distinct vector t
}
cout << t(longitudeArray[5])[6] << endl; //Output: 5th element of longitudeArray in my 6th block
return 0;
}
如果您有任何提示,尤其是如果有更好的方法来处理大型 .csv 文件,我将不胜感激。
Ps:C++对于这个项目来说是不可避免的......
Tüdelüü, jtotheakob
【问题讨论】:
-
如果你想使用一些 STL,我会倾向于使用时间步长的地图。然后,您可以随机访问,而不是向量中的线性访问。然后,您可以在地图中的每个位置都有一个二维数组。
-
您真的要使用字符串而不是数值吗?您说您的文件包含
45'537'984'000值,即使对于浮点数也将是 169GB 的数据,而对于字符串则要多得多(如果 SSO 对每个字符串都启动,则大约是 gcc 的 8 倍) -
@Yksisarvinen:这里如果存储为 char 数组,每个值将使用 4 个字节,而 double 通常使用 8 个字节,因此大小是一个糟糕的参数。但我同意你的观点,数据应该转换为 double 和 NaN 到 double nan。
-
@SergeBallesta 没错,我想在代码中使用
std::string,但char[4]的内存效率更高。 -
@Yksisarvinen:老 C 程序员以老 C 风格思考 ;-)
标签: c++ multidimensional-array vector read.csv