【问题标题】:Ruby: parsing CSV from ARGF, broken?Ruby:从 ARGF 解析 CSV,坏了?
【发布时间】:2022-01-08 12:11:18
【问题描述】:

我有一个file.csv

value1,value2

我使用以下命令转换为 JSON:

# adding headers on the fly
echo 'key1,key2' |
ruby -rcsv -rjson -e 'puts CSV.new(ARGF,headers:true).map(&:to_hash).to_json' - file.csv

输出应该是:

[{"key1":"value1","key2":"value2"}]

ruby-2.0 和 2.3 是这种情况,但是 ruby​​-2.7 的输出是:

[]

进一步调试表明 ruby​​-2.7 CSV 库不能很好地处理 ARGF,它会在 ARGF 中的第一个 file 之后停止读取(在我的情况下为标准输入)。

较新的 Ruby 版本是否也会受到此问题的影响?有没有更便携的方式来做同样的魔法?

【问题讨论】:

标签: ruby csv


【解决方案1】:

我能够重现此问题。不过,似乎ARGF 对象在 Ruby 2.5 和 Ruby 2.7 中的行为方式相同。两个版本都给了我这个输出:

$ echo 'key1,key2' | ruby -rcsv -rjson -e 'p ARGF.read; p ARGF.read; p ARGF.read' - file.csv
"key1,key2\n123,345\n"
nil
nil

但是,CSV 库所做的事情一定有一些奇怪的地方让您的用例停止工作。

无论如何,与其依靠 Ruby 的 ARGF 和 CSV 库将标准输入与 file.csv 连接起来,您可以使用您的 shell 连接这两个东西,这样就可以了:

( echo 'key1,key2'; cat file.csv ) | ruby -rcsv -e 'puts CSV(ARGF,headers:true).map(&:to_hash)'

ruby -rcsv -e 'puts CSV(ARGF,headers:true).map(&:to_hash)' <( echo 'key1,key2'; cat file.csv )

【讨论】:

  • ARGF.read 确实按预期工作:例如 echo 'key1,key2' | ruby -rcsv -rjson -e 'puts CSV.parse(ARGF.read, headers: true).map(&amp;:to_hash).to_json' - file.csv 正在使用 ruby​​-2.7
  • 用 shell 结构替换我的“动态添加标题”是一个很好的解决方法。替换文件参数更成问题:ruby [...] file1.csv file2.csv file3.csv ... 确实 not 工作(使用CSV(ARGF)
  • ruby [...] &lt;( cat file1.csv file2.csv file3.csv ) 怎么样?
  • 顺便说一句,您似乎确实在 Ruby 的 CSV 或 ARGF 库中发现了一个错误。您可以向 Ruby 开发人员报告。
  • 我完成了 ruby​​-3.0 的安装,它也不起作用...我会填写一个错误报告。
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2012-03-25
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多