我正在尝试在 CSV 文件中查找某些标头值的索引,以便我可以使用它们来提取文件其余部分中这些位置的数据。我将标头值添加到 amap<std::string, int>
中,以便保留索引。
我有工作代码,直到我注意到如果标题是行中的最后一个值,它不匹配。最后一个标题字符串在我的嵌套循环中是空的,但在外循环中不是。
const int columnCount = 2;
std::string columns[columnCount] = { "column1", "column2" };
map<std::string, int> columnMap;
std::vector<std::string> cols(columns, columns + columnCount);
std::vector<std::string> cells;
boost::tokenizer<boost::escaped_list_separator<char> > tok(header_row);
cells.assign(tok.begin(), tok.end());
std::vector<std::string>::iterator iter_cells;
std::vector<std::string>::iterator iter_cols;
for (iter_cells = cells.begin(); iter_cells != cells.end(); ++iter_cells) {
std::string cell = *iter_cells;
for(iter_cols = cols.begin(); iter_cols != cols.end(); ++iter_cols) {
std::string col = *iter_cols;
cout << cell << "=" << col;
if(col.compare(cell) == 0) {
cout << " MATCH" << endl;
columnMap.insert(std::make_pair(*iter_cols,iter_cells-cells.begin()));
break;
}
cout << endl;
}
}
tok(row)
相当于tok("column0,column1,column2")
我得到这个输出的地方;
column0=column1
column0=column2
column1=column1 MATCH
=column1
=column2
而如果它是tok("column0,column1,column2,column3")
我得到的;
column0=column1
column0=column2
column1=column1 MATCH
column2=column1
column2=column2 MATCH
=column1
=column2
当我cout << cell
在外循环中时,值显示正确。
为什么我cell
在内部循环中失去了价值?
编辑
github和测试文件中的代码是用编译的;
gcc parse_csv.cpp -o parse_csv -lboost_filesystem -lmysqlpp
并执行
./parse_csv /home/dave/SO_Q/
我得到这个输出;
Process File: /home/dave/SO_Q/test_2.csv
metTime
metTime=metTime MATCH
Ta
=metTime
=Ta
=Ua
=Th
Process File: /home/dave/SO_Q/test_1.csv
DATE_TIME_UTC
DATE_TIME_UTC=metTime
DATE_TIME_UTC=Ta
DATE_TIME_UTC=Ua
DATE_TIME_UTC=Th
Ta
Ta=metTime
Ta=Ta MATCH
metTime
=metTime
=TaTime
=UaTime
=ThTime