使用 getline 进行 csv 处理时行为不明确
Unclear behavior with csv processing using getline
我在处理csv文件时遇到了一点问题。我对C++很陌生,正在努力学习。这可能是我忽略的一件小事,但我在网上搜索了答案,无法弄清楚我哪里出错了。我正在尝试处理一个具有多行和逗号分隔值的文件(如果这有所作为,行尾没有逗号) - 请注意,当我尝试发布刚才的文本时,它不包括段落分隔符,我不得不手动添加它 - 不确定这是否有区别
特价,11/9/14,11/9/14,亚马逊MKTPLACE PMTS,-8.99
特价,10/4/14,10/5/14,亚马逊MKTPLACE PMTS,-13.08
销售,10/3/14,10/5/14,亚马逊MKTPLACE PMTS,-9.82
销售,10/2/14,10/3/14,亚马逊MKTPLACE PMTS,-45.48
特价,8/21/14,8/22/14,亚马逊MKTPLACE PMTS,-9.99
特价,11/8/14,11/9/14,亚马逊.com,-64.7
销售,10/1/14,10/2/14,APL* ITUNES.COM/BILL,-1.08
销售,9/15/14,9/16/14,4月*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
我遇到的问题是,由于某种奇怪的原因,在逗号分隔的每个第 5 个标记处理后,单词“Sale”
覆盖了单词Value
,我不明白为什么。非常感谢一些指导。
根据描述(但在引用的文本中不可见),每行都以 'r'
(回车)字符开头。某些系统使用行尾序列。Windows 通常使用 "rn"
(回车符、换行符),当以非binary
模式打开文件时(即,在创建流时不传递标志std::ios_base::binary
时),该'n'
将被单个替换。但是,对于"\n\r"序列,不会发生此替换。
您可以通过在创建std::istringstream
之前替换所有'r'
字符来轻松验证此理论(我在那里放了一个额外的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 Procesingn";
神奇之处在于读取行时添加了<< std::ws
,这简单地删除了所有前导空格。该代码还删除了std::endl
的不当使用。如果每行的第一个单词可能包含前导空格,则需要不同的方法,可能会在创建linestream
之前删除'r'
字符,例如,使用
line.erase(std::remove(line.begin(), line.end(), 'r'), line.end());
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 不明确的成员模板查找
- gcc出现不明确的模板实例化错误
- 调用'Node'构造函数是不明确的
- 如何解决不明确的运算符过载问题?
- CStdioFile 不能处理大于 2GB 的文件?
- 使用 nullptr 调用重载方法是不明确的
- "fpclassify":对重载函数的不明确调用
- 对"列表"的引用不明确,包括头文件
- 删除全局隐式函数 - 避免使用不明确的运算符
- 当接收到不明确的规范时,表示图的邻接列表的数据结构
- 解析一般CSV读取功能时,如何处理不同的数据类型?(不明确指定它们)
- 可变函数指针参数的模板参数推导-处理不明确的情况
- 使用 getline 进行 csv 处理时行为不明确