ifstream file;
file.open("file.csv");
string str;
while(file.good())
{
getline(file,str,',')
if (___) // string was split from delimiter
{
[do this]
}
else // string was split from eol
{
[do that]
}
}
file.close();
我想从csv文件中读取内容,并区分由于新行而导致字符串被拆分时发生的情况以及由于所需的分隔符而导致字符串被拆分时发生的情况 - 即填写上面示例代码中的___
。
我能想到的方法是:
(1)手动将字符添加到原始文件中每行的末尾
(2)通过写入另一个文件
,自动在每行的末尾添加一个字符(3)使用不带分隔符的getline
然后创建一个函数来将结果字符串拆分为','。
但是有更简单或直接的解决方案吗?
(我之前已经问过类似的问题,但我没有看到任何解决方案。)
答案 0 :(得分:1)
我对代码清晰度的偏好是使用你的选项3) - 使用标准'\ n'分隔符的getline()
将文件逐行读入缓冲区,然后使用像{一样的标记器{1}}(如果你想在C级上工作)或strtok()
来解析你从文件中读取的字符串。
你真的在这里处理两个不同的步骤,首先将行读入缓冲区,然后分开缓冲区以提取你所追求的组件。您的代码应该反映出这一点,通过这样做,您还可以避免处理奇怪的状态,例如您描述的那些最终不得不进行额外解析的状态。
答案 1 :(得分:1)
没有简单的方法来确定"哪个分隔符终止了字符串",它被消费了#34;由getline
,所以它输给你了。
阅读该行,并自己解析逗号。您可以使用std::string::find()
来查找逗号 - 但是,如果您的文件包含本身包含逗号的字符串,则必须逐个字符地解析字符串,因为您需要区分引用文本中的逗号和未引用的逗号文本。
答案 2 :(得分:0)
您的重大问题是您的代码没有按照您的想法执行。
带有分隔符的 getline
将\n
视为我阅读文档时的另一个字符。它不会在分隔符和换行符上分开。
执行此操作的有效方法是编写您的自定义拆分getline:cppreference有一个非常明确的描述getline的功能,模仿它应该很容易(并且比从臀部拍摄更安全,文件很棘手)。
然后返回字符串,以及有关您在第二个频道中完成解析的原因的信息。
现在,天真地使用getline然后拆分也是可行的,并且写入速度会快得多,并且可能更不容易出错。