我有一个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.7csvlib不能很好地处理ARGF,它在ARGF中的第一个文件之后停止读取(在我的例子中是stdin)。
更新的Ruby版本也会受到这个问题的影响吗?有没有一种更便携的方法来实现同样的魔法?
发布于 2021-12-01 23:46:22
我能够重现这个问题。不过,在Ruby2.5和Ruby2.7中,ARGF对象的行为似乎都是一样的。这两个版本都为我提供了以下输出:
$ 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 )https://stackoverflow.com/questions/70192053
复制相似问题