我有一个 10m 行的文件,每一行都是这样的:
{ "_id" : ObjectId("567f972cad55ac0797baa773"), "id" : 357103 }
对于每一行,我需要用它的 "id"
值做一些事情。
到目前为止我有:
listings.each.with_index do |line, idx|
# listing_id = JSON.parse(line).fetch("id") #>> invalid JSON error
# line.split('"id : "') #=> some gibberish
line.match(/"id" : (.*)/)[1] #=> "357103 }"
parse
抛出行不是有效 json 的错误。 split
返回一些乱码。我得到的最接近我期望的结果是 match
,但它返回上述示例 "357103 }"
。
你能帮我解决一下吗?
此处的拆分比正则表达式更快。对于如此大的文件,它可能会产生明显的差异。
此外,您似乎需要转义那些双引号:line.split("\"id\": ")
> puts Benchmark.measure{line.split("\"id\" : ").last.delete('}').delete(' ')}
0.000000 0.000000 0.000000 ( 0.000020)
> puts Benchmark.measure{line.match(/\s(\d+)\s/)[1]}
0.000000 0.000000 0.000000 ( 0.000043)
更新
甚至更快,一路使用拆分:
> puts Benchmark.measure{line.split("\"id\" : ").last.split(' ').first }
0.000000 0.000000 0.000000 ( 0.000008)
编辑
尽管正如 Stefan 在他的评论中提到的,看起来您的文件是 BSON (MongoDB) 而不是 JSON。有一个Mongo gem .
我是一名优秀的程序员,十分优秀!