我写了一个简单的 CSV 文件解析器。但看完之后有关 CSV 格式的 wiki 页面 http://en.wikipedia.org/wiki/Comma-separated_values我注意到基本格式的一些“扩展”。通过双引号专门嵌入逗号。我已经设法解析这些内容,但是还有第二个问题:嵌入双引号。
Example:
12345,"ABC, ""IJK"" XYZ" -> [1234] 和 [ABC, ""IJK"" XYZ]
我似乎找不到正确的方法来区分带双引号和不带双引号。所以我的问题是解析 CVS 格式(例如上面的格式)的正确方法/算法是什么?
我通常思考这个问题的方式基本上是将带引号的值视为单个未带引号的值or形成用引号连接的值的双引号值序列。那是,
- to parse the next atom in the row:
- 读取第一个非空白字符
- if the current character is not a quote:
- 标记当前位置
- 读到下一个逗号或换行符
- 返回标记和逗号之前的字符之间的文本(如果适用,请去掉空格)
- if the current character is a quote:
- 创建一个空字符串缓冲区
- while the current character is not a quote
- 标记当前位置+1(跳过引号字符)
- 阅读下一个报价
- 如果缓冲区不为空,则在其中添加引号
- 将标记和当前位置之前的字符之间的文本附加到缓冲区(以去除两个引号)
- 前进一个字符(超过刚读过的引用)
- 读到下一个逗号或换行符
- 返回缓冲区
本质上,拆分带引号的字符串的每个双引号段,然后用引号将它们连接在一起。因此:"ABC, ""IJK"" XYZ"
变成ABC,
, IJK
, XYZ
,这又变成ABC, "IJK" XYZ
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)