嵌入双引号的CSV解析

4 c++ csv algorithm parsing

我编写了一个简单的CSV文件解析器。但是在查看CSV格式Wiki页面后,我注意到基本格式有一些“扩展”。通过双引号专门嵌入逗号。我设法解析了这些,但是还有第二个问题:嵌入式双引号。

例:

12345,“ ABC,”“ IJK”“ XYZ”-> [1234]和[ABC,“ IJK” XYZ]

我似乎找不到正确的方法来区分封闭的双引号和无双引号。所以我的问题是解析CVS格式(例如上述格式)的正确方法/算法是什么?

Sin*_*ion 5

我通常认为的方式基本上是将带引号的值视为单个,不带引号的值双引号的值的序列,这些值形成用引号连接的值。那是,

  • 解析行中的下一个原子:
    • 读取第一个非空白字符
    • 如果当前字符不是引号:
      • 标记当前位置
      • 阅读下一个逗号或换行符
      • 在逗号前返回标记和字符之间的文本(如果需要,带空格)
    • 如果当前字符是引号:
      • 创建一个空的字符串缓冲区
      • 而当前字符不是引号
        • 标记当前位置+1(跳过引号字符)
        • 阅读下一个报价
        • 如果缓冲区不为空,请在其后附加引号
        • 将当前位置之前的标记和字符之间的文本追加到缓冲区中(以去除两个引号)
        • 前进一个字符(粘贴刚读的引号)
      • 阅读下一个逗号或换行符
      • 返回缓冲区

本质上,分割带引号的字符串的每个双引号段,然后将它们与引号一起分类。因此:"ABC, ""IJK"" XYZ"ABC, IJK XYZ,这反过来又成为ABC, "IJK" XYZ