将制表符和换行符分隔的CSV数据导入变量

时间:2013-11-05 03:49:26

标签: c++ csv import tabs

这是我用来将data.csv文件中的数据导入24个变量的一段代码:

#include <iostream>
#include <fstream>
using namespace std;

double xa = 0;
double ya = 0;
double Ta = 0;
double Ca = 0;
double Ma = 0;
double Da = 0;

double xb = 0;
double yb = 0;
double Tb = 0;
double Cb = 0;
double Mb = 0;
double Db = 0;

double xc = 0;
double yc = 0;
double Tc = 0;
double Cc = 0;
double Mc = 0;
double Dc = 0;

double xd = 0;
double yd = 0;
double Td = 0;
double Cd = 0;
double Md = 0;
double Dd = 0;


//__________________________________________________

int trash    = 0;   // ifstream bug (?) stuff

//___________________________________

int main() {


    ifstream ifs ("data.csv"); ///LOADING
if (!ifs)
    // process error
ifs >>  trash;
ifs >>  xa ;
ifs >>  ya ;
ifs >>  Da ;
ifs >>  Ma ;
ifs >>  Ca ;
ifs >>  Ta ;
ifs >>  xb ;
ifs >>  yb ;
ifs >>  Db ;
ifs >>  Mb ;
ifs >>  Cb ;
ifs >>  Tb ;
ifs >>  xc ;
ifs >>  yc ;
ifs >>  Dc ;
ifs >>  Mc ;
ifs >>  Cc ;
ifs >>  Tc ;
ifs >>  xd ;
ifs >>  yd ;
ifs >>  Dd ;
ifs >>  Md ;
ifs >>  Cd ;
ifs >>  Td ;

当然(我猜......),它仅适用于此CSV结构(每行包含一个新的单个数据:)

63.64474122 
5.21472834  
0.40511019  
0.26155648  
0.00000000  
0.00000000
34.45902482 
15.62249852 
0.22086168  
0.00000000  
0.44580498  
0.00000000
82.11020306 
14.02709406 
0.50748794  
0.00000000  
0.00000000  
0.15917872
0.00000000  
0.00000000  
0.00000000  
0.00000000  
0.00000000  
0.00000000

出于显而易见的实际原因,我想将此文件结构用于CSV(制表符和换行符分隔):

63,64474122 5,21472834  0,40511019  0,26155648  0,00000000  0,00000000
34,45902482 15,62249852 0,22086168  0,00000000  0,44580498  0,00000000
82,11020306 14,02709406 0,50748794  0,00000000  0,00000000  0,15917872
0,00000000  0,00000000  0,00000000  0,00000000  0,00000000  0,00000000

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

你的代码(尽管很糟糕)应该适用于这两个文件。 iostream输入操作符将输入视为,这意味着对于intdouble类型,他们并不关心值是如何分开的(通过换行符或者通过空白)。

现在,仔细看看,我看到第二个文件使用逗号而不是小数点。有三种方法可以解决这个问题:

  • 您可以强制将区域设置作为将逗号视为小数点的区域设置(请参阅this question
  • 您可以在程序阅读之前使用脚本预处理文件。
  • 最后,您可以先将每个数字读入std::string变量,然后使用std::istringstream将其转换为double

无论如何,您应该认真考虑阅读iostream用法。至少你应该检查输入错误。不,没有“ifstream bug”这样的东西。