阅读.csv科学记数法

时间:2012-06-15 14:30:05

标签: c++ csv

我正在尝试阅读此.csv文件,这是一个数据示例:

1.33286E+12 0   -20.790001  -4.49   -0.762739   -3.364226   -8.962189

1.33286E+12 0   -21.059999  -4.46   -0.721878   -3.255263   -8.989429

问题在于第一列第1行和第2行。在excel文件中,它表示单元格中的数字显示为1.33286E + 12,当您单击单元格时,它表示它们是1332856031313和1332856031328但是程序正在阅读它们为1.33286E + 12但我需要整数1332856031313和1332856031328。

代码:

inputfile.open(word1.c_str());
while (getline (inputfile, line)) //while line reads good
{
  istringstream linestream(line); //allows manipulation of string
  string str;

while (getline (linestream, item, ',')) //extract character and store in item until ','
    {

  char * cstr, *p; 
  cstr = new char [item.size()+1]; 
  strcpy(cstr, item.c_str()); 
  p = strtok(cstr, " "); 

  while (p!=NULL) //while not at the end loop
    {      // double e = atof(p); // coverts p to double
        value++;
        if( value == 1)
                {     double e = atof(p); // coverts p to double
          if(m ==1)
          cout << time[0]<<"\n";

          ostringstream str1;
           str1 << e;
          str = str1.str();
          string str2;
          str2.append(str.begin(), str.end());
          const char * convert = str2.c_str();
          e = atof(convert);
         time[m] = e*0.001;
          m++;
          //if(m >=192542)
          //cout << time[m-1]<<"\n";

        }

               p = strtok(NULL, " ");
    }
  delete[] cstr; //delete cstr to free up space.
}
count ++;
value = 0;
}
inputfile.close();

2 个答案:

答案 0 :(得分:2)

如果数字1332856031313被序列化为1.33286E + 12,则无法在反序列化过程中将其恢复。这6个额外有效数字形式的信息将永远消失。您需要确保在生成CSV文件时,它以完全精确的方式保存。我不知道你怎么用Excel做这件事。

此外,您对atofconst char*的使用并不是非常C ++。考虑使用像

这样的代码
double a, b, c, d;
linestream >> a >> b >> c >> d;

代替。

答案 1 :(得分:0)

鲁克已经打败了我,但我会提出一个建议。使用循环进行解码,测试stringstream状态。好的,有两个建议:将代码分解为函数。把它全部放在一个大块中使得它更难理解。

    void DecodeLine(const std::string &sLine, 
                    std::vector<double> &vResults)
    {
        std::istringstream istr(sLine);
        double d = 0;
        istr >> d;
        while (!istr.fail())
        {
            vResults.push_back(d);
            istr >> d;
        }
    }