加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

quote_char导致适合ruby CSV导入

发布时间:2020-12-17 03:05:21 所属栏目:百科 来源:网络整理
导读:我有一个使用|的简单CSV文件(管道)作为引用字符.将我的rails应用程序从 Ruby 1.9.2升级到1.9.3后,我收到“CSV :: MalformedCSVError:第1行中缺少或流浪的引用”错误. 如果我弹出打开vim并替换|使用常规引号,单引号甚至“=”,文件工作正常,但是|和*导致错误.
我有一个使用|的简单CSV文件(管道)作为引用字符.将我的rails应用程序从 Ruby 1.9.2升级到1.9.3后,我收到“CSV :: MalformedCSVError:第1行中缺少或流浪的引用”错误.

如果我弹出打开vim并替换|使用常规引号,单引号甚至“=”,文件工作正常,但是|和*导致错误.有人对可能导致这种情况的原因有任何疑问吗?这是一个可以重现错误的简单单线程:

@csv = CSV.read("public/sample_file.csv",{quote_char: '|',headers: false})

同样在Ruby 2.0和irb w / out load rails中重现了这一点.

编辑:以下是CSV中的一些示例行

|076N102                 |,|CARD                                    |,|         1|,|NEW|,|PCS       |
|07-1801                 |,|BASE                                    |,|        18|,|PCS       |

解决方法

我想你刚刚发现了CSV ruby??模块中的一个错误.
来自csv.rb:

1587:  @re_chars =   /#{%"[-][.^$?*+{}()|# rntfv]".encode(@encoding)}/

此Regexp用于转义与特殊正则表达式符号冲突的字符,包括“管道”char | .
我没有看到任何前置[ – ]的原因,所以如果你删除它,你的例子开始工作:

编辑:只有当不作为主角时,连字符必须在字符集表达式(用方括号[]括起来)内进行转义.所以不得不更新固定的Regexp:

1587:  @re_chars =   /#{%"(?<![)-(?=.*])|[.^$?*+{}()|# rntfv]".encode(@encoding)}/

CSV.read('sample.csv',{quote_char: '|'})
# [["076N102                 ",#  "CARD                                    ",#  "         1","NEW","PCS       "],# ["07-1801                 ",#  "BASE                                    ",#  "        18","PCS       "]]

由于大多数语言不支持带有量词的lookbehind表达式,包括Ruby,我不得不把它写成左括号的负面版本.它还会匹配连字符与缺少左侧一个括号对的连字符.如果您找到更好的解决方案,请发表评论.

很高兴听到任何评论,然后填写错误报告给ruby-lang.org.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读