c ++ csv数据导入问题

时间:2017-12-05 20:06:34

标签: c++ csv

我是一名大学生,作为我最后一个c ++课程项目的一部分,我们被分配到读取具有距离和力数据的csv文件,然后从中找到扭矩。我遇到的问题是如何实际将数据从csv文件中转换为可行的格式。目前我一直在努力将它变成一个矩阵,虽然我需要先确定csv文件的大小,因为它应该采用任何大小的文件。这是数据的格式

案例1 ,,,,, x_position(m),y_position(m),z_position(m),F_x(N),F_y(N),F_z(N)16.00,5.00,8.00,394.00,-18.00, 396.0022.00,26.00,14.00,-324.00,-420.00,429.0028.00,25.00,21.00,73.00,-396.00,-401.006.00,9.00,12.00,-367.00,-137.00,-143.00

显然,不同的数据片段(距离和力)需要放入不同的矢量或矩阵中。 这是我到目前为止试图找到文件中的行数。

ifstream myfile("force_measurements.csv");
if(myfile.is_open()){
        string line;
        double num=0;
        getline(myfile, line);
        if(line==""){
            cout<<num<<endl;
            myfile.close();
        }
        else{
            num++;
        }
}

在此之后,您将如何将数据放入矩阵中?或者不同的格式会更容易吗?矢量是我的另一个。

2 个答案:

答案 0 :(得分:0)

// you need to include the proper headers here
class vec3D:
{
     double m_x, m_y, m_z;
 public:
     void Set(size_t indx, double val)
     {
         switch(indx)
         { 
             case 0:
                 m_x = val;
                 break;
             case 1:
                 m_y = val;
                 break;
             case 2:
                 m_z = val;
                 break;
             default:
                 std::cout << "index out of range" << std::endl;
         }
     }
     double magnitude() { return std::sqrt( m_x*m_x + m_y*m_y + m_z*m_y);}
};

int main()
{
     std::ifstream my_data_file ( "your_file_here.csv" );
     std::vector<std::array<vec3D, 2>> Pos_Forz;
     if ( ! my_data_file.is_open())
     {
          std::cout << "failure to open the file" <<std::endl;
          return -1;
     }
     std::string temp_str;
     double arr[6];
     std::array<vec3D,2> temp_3Dvec;
     while(!my_data_file.eof())
     {
         for (int i = 0; i<5 ; i++)
         {
             getline(my_data_file, temp_str, ",");
             arr[i] = std::stod(temp_str);
         }
         getline(my_data_file, temp_str);
         arr[5] = std::stod(temp_str);
         for(int i = 0; i<2; i++)
         { 
             for (int j=0; j<3; j++)
             {
                   temp_3Dvec[i].set(j, arr[i*3 + j]);
             }
         }
         Pos_Forz.push_back(temp_3Dvec);
     }
    for(auto e: Pos_Forz)
    {
      std::cout << " toque = " << (e[0].magnitude() * e[1].magnitude()) <<std::endl;
    }
    return 0;
 }

修复需要修复的内容,并从这段代码中激励自己,也不要在这里提出这类问题,你需要阅读发布的HOW TO

答案 1 :(得分:-2)

您有多个问题。这是我用来从csv加载项目的东西。这可以帮助您入门,并且可以确定数据的进一步组织是否有用。我个人有一些类,它们采用标记化的行并用它们创建自己的实例。

#include <boost/tokenizer.hpp>
typedef vector<string> csvLine;
void aFunction()
{
    string line;
    vector<csvLine> usedCollection;
    ifstream csvFile("myfile.csv", ios::in);
    if (!csvFile)
        return -1;

    while (getline(csvFile, line))
    {
        vector<string> tokenizedLine;
        boost::tokenizer<boost::escaped_list_separator<char> > tk(
            line, boost::escaped_list_separator<char>('\\', ',', '\"'));
        for (const string& str : tk)
        {
            tokenizedLine.push_back(str);
        }
        usedCollection.push_back(tokenizedLine);
    }
    csvFile.close();
}

所以usedCollectioncsvLines的集合,其中每个都是由分隔符分隔的字符串集合。