我是一名大学生,作为我最后一个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++;
}
}
在此之后,您将如何将数据放入矩阵中?或者不同的格式会更容易吗?矢量是我的另一个。
答案 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();
}
所以usedCollection
是csvLines
的集合,其中每个都是由分隔符分隔的字符串集合。