我正在尝试编写一个读取CSV文件的程序(无需担心转义任何内容,它的格式严格没有引号),但任何值为0的数字项都只是留空。所以正常线看起来像:
12,字符串1,string2,3 ,,, string3,4.5
而不是
12,字符串1,string2,3,0,0,string3,4.5
我有一些使用矢量的工作代码,但它太慢了。
int main(int argc, char** argv)
{
string filename("path\\to\\file.csv");
string outname("path\\to\\outfile.csv");
ifstream infile(filename.c_str());
if(!infile)
{
cerr << "Couldn't open file " << filename.c_str();
return 1;
}
vector<vector<string>> records;
string line;
while( getline(infile, line) )
{
vector<string> row;
string item;
istringstream ss(line);
while(getline(ss, item, ','))
{
row.push_back(item);
}
records.push_back(row);
}
return 0;
}
是否可能重载运算符&lt;&lt;当字段可以为空时,类似于How to use C++ to read in a .csv file and output in another form?的ostream? 这会改善表现吗?
或者我还能做些什么来让它跑得更快? 感谢
答案 0 :(得分:2)
从文件中读取字符串数据所花费的时间大于解析它所花费的时间。在解析字符串时,您不会节省大量时间。
为了让您的程序运行得更快,请阅读更大的&#34; chunks&#34;进入记忆;每次读取获得更多数据。研究内存映射文件。
答案 1 :(得分:1)
处理此问题以获得更好性能的另一种方法是将整个文件读入缓冲区。然后浏览缓冲区并设置指向值开始位置的指针,如果找到a或者放在\ 0中的行尾。