一、算法原理
在读取csv文件进行点云处理的时候,常常需要跳过表头,并且进行批量读取。本代码,将每行数据记录为一个数组,并将多个csv文件合并记录。
在使用中,需要自己修改想要提取的列数以及定义的参数。
二、代码实现
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <cmath>
#include <iomanip>
#include <Eigen/Dense>
using namespace Eigen;
// 结构体用于存储CSV中的一行数据
struct CSVRow {
std::string col1;
std::string col2;
std::string col3;
std::string col4;
std::string col5;
std::string col6;
std::string col7;
std::string col8;
std::string col9;
std::string col10;
std::string col11;
std::string col12;
std::string col13;
std::string col14;
std::string col15;
std::string col16;
std::string col17;
std::string col18;
std::string col19;
std::string col20;
std::string col21;
std::string col22;
std::string col23;
std::string col24;
std::string col25;
};
// 读取CSV文件的指定列
std::vector<CSVRow> readCSVColumn(const std::string& filename) {
std::vector<CSVRow> data;
std::ifstream infile(filename);
if (!infile) {
std::cerr << "无法打开文件: " << filename << std::endl;
return data;
}
// 跳过第一行
std::string skipLine;
std::getline(infile, skipLine);
std::string line;
while (std::getline(infile, line)) {
std::istringstream iss(line);
std::string col1, col2, col3, col4, col5, col6, col7, col8;
if (std::getline(iss, col1, ',') && std::getline(iss, col2, ',') &&
std::getline(iss, col3, ',') && std::getline(iss, col4, ',') && std::getline(iss, col5, ',') &&
std::getline(iss, col6, ',') && std::getline(iss, col7, ',') && std::getline(iss, col8, ',')) {
std::string col9, col10, col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, col21, col22, col23, col24, col25;
std::getline(iss, col9, ',');
std::getline(iss, col10, ',');
std::getline(iss, col11, ',');
std::getline(iss, col12, ',');
std::getline(iss, col13, ',');
std::getline(iss, col14, ',');
std::getline(iss, col15, ',');
std::getline(iss, col16, ',');
std::getline(iss, col17, ',');
std::getline(iss, col18, ',');
std::getline(iss, col19, ',');
std::getline(iss, col20, ',');
std::getline(iss, col21, ',');
std::getline(iss, col22, ',');
std::getline(iss, col23, ',');
std::getline(iss, col24, ',');
std::getline(iss, col25, ',');
data.push_back({ col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, col21, col22, col23, col24, col25 });
}
}
infile.close();
return data;
}
int main() {
std::vector<std::string> filenames = {
"C:\\Users\\dell\\Desktop\\440882004003000100533.csv",
"C:\\Users\\dell\\Desktop\\440882004003000100534.csv",
//在此处添加需要处理的文件
};
std::vector<CSVRow> combinedData;
for (const auto& filename : filenames) {
std::vector<CSVRow> csvData = readCSVColumn(filename);
combinedData.insert(combinedData.end(), csvData.begin(), csvData.end());
}
return 0;
}
三、注意事项
此代码只适用于读取csv文件,不涉及如何输出文件。