我有一个小问题文件处理一个csv文件。我对C++非常陌生,我正在努力学习。这可能是一件我忽略的小事情,但我已经在网上搜索了答案,但我不知道我哪里出错了。我正在尝试处理一个文件,其中包含多行和逗号分隔的值(行尾没有逗号,但如果这有区别的话) --注意,当我刚才试图发布文本时,它没有包含段落中断,我不得不手动添加它--不确定这是否有什么区别。
销售,11/9/14,11/9/14,AMAZON MKTPLACE PMTS,-8.99 销售,10/4/14,10/5/14,AMAZON MKTPLACE PMTS,-13.08 销售,10/3/14,10/5/14,AMAZON MKTPLACE PMTS,-9.82 销售,10/2/14,10/3/14,AMAZON MKTPLACE PMTS,-45.48 销售,8/21/14,8/22/14,AMAZON MKTPLACE PMTS,-9.99 销售,11/8/14,11/9/14,Amazon.com,-64.7 销售,10/1/14,10/2/14,APL* ITUNES.COM/BILL,-1.08 销售,9/15/14,9/16/14,APL* ITUNES.COM/BILL,-1.08
我尝试使用getline将每一行放入一个stringstream中,然后使用下面的代码通过逗号分隔符解析这些行:
ifstream file("test1.csv");
string value, line;
while (getline(file, line)) {
stringstream linestream(line);
while (getline(linestream, value, ',')) {
cout << "Value: " << value << endl;
} // while
cout << "Done Procesing" << endl;
} // while我遇到的问题是,由于一些奇怪的原因,在逗号分隔处理的第五个令牌之后,单词“Sale”覆盖了单词Value,我不明白为什么。会很感激你的指导。
发布于 2014-11-25 05:10:27
根据描述(但在引用的文本中不可见),每一行都以'\r' (回车)字符开头。有些系统使用行序列的末尾。Windows通常使用"\r\n" (回车、行提要),在以非binary模式打开文件时(即在创建流时不传递标志std::ios_base::binary )将被单个'\n'替换。但是,这种替换不会发生在"\n\r“序列上。
在创建'\r'之前,您可以很容易地通过替换所有std::istringstream字符来验证这一理论(我在其中插入了一个额外的i,因为我不明白为什么应该创建读/写流):
std::transform(line.begin(), line.end(), line.begin(), '\r', '@');
std::istringstream linestream(line);有了这个更改,除了第一行之外,所有单词的输出都会如下所示:
Value: @Sale解决问题的最简单方法是在读取行时跳过前面的空格。相应的代码摘录如下所示:
std::ifstream file("test1.csv");
for (std::string line; std::getline(file << std::ws, line); ) {
std::istringstream linestream(line);
for (std::string value; std::getline(linestream, value, ','); ) {
std::cout << "Value: " << value << '\n';
} // for
}
std::cout << "Done Procesing\n";它的神奇之处是在读取行时添加了<< std::ws,它简单地删除了所有的前导空格。代码还移除std::endl。如果每行的第一个单词可能包括前导空格,则需要一种不同的方法,可能在创建'\r'之前删除linestream字符,例如,使用
line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());https://stackoverflow.com/questions/27117872
复制相似问题