如何在ruby中从行中提取数据?
我有一个10万行的文件,每行如下:如何在ruby中从行中提取数据?,ruby,Ruby,我有一个10万行的文件,每行如下: { "_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" : 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<代码>拆分返回一些胡言乱语。我得到的最接近我期望的结果是match
,但对于上面的示例“357103}”
,它返回
你能帮我修一下吗?你可以使用\s(\d+)\s
正则表达式,不需要JSON解析
line.match(/\s(\d+)\s/)[1] #=> "357103"
您可以使用\s(\d+)\s
regex,不需要JSON解析
line.match(/\s(\d+)\s/)[1] #=> "357103"
ID是由所有数字组成的吗?您可以尝试使用一个正则表达式来查找冒号,然后再查找数字列表
Line.match(/"id " : [0-9]+/)
查找后跟任意长度整数的Id
如果有字母和数字,则:
Line.match(/"id" :[[:alnum:]]+/)
ID是由所有数字组成的吗?您可以尝试使用一个正则表达式来查找冒号,然后再查找数字列表
Line.match(/"id " : [0-9]+/)
查找后跟任意长度整数的Id
如果有字母和数字,则:
Line.match(/"id" :[[:alnum:]]+/)
您可以使用拼接进行匹配:
line[/(?<= )\d+/] = 357103
line[/(?您可以使用拼接进行匹配:
line[/(?<= )\d+/] = 357103
line[/(?这里的拆分速度比Regex快。对于如此大的文件,它可能会产生明显的不同
另外,看起来您需要对这些双引号进行转义:line.split(“\”id\:”)
更新
更快速的是,始终使用拆分:
> puts Benchmark.measure{line.split("\"id\" : ").last.split(' ').first }
0.000000 0.000000 0.000000 ( 0.000008)
编辑
尽管Stefan在评论中提到,看起来您的文件是BSON(MongoDB)而不是JSON。这里有一个Mongo。这里的拆分速度比正则表达式快。有了这么大的文件,可能会有明显的不同
另外,看起来您需要对这些双引号进行转义:line.split(“\”id\:”)
更新
更快速的是,始终使用拆分:
> puts Benchmark.measure{line.split("\"id\" : ").last.split(' ').first }
0.000000 0.000000 0.000000 ( 0.000008)
编辑
尽管Stefan在评论中提到,看起来您的文件是BSON(MongoDB)而不是JSON。有一个Mongo。是格式(应该是)JSON?如果是,那就提出来。不要只是在代码中突然使用JSON方法,并期望读者猜出原因。如果不是JSON,那就不要使用JSON方法。它通常是JSON格式,但我昨晚做了错误的提取,我对ruby一无所知。要么请你们帮忙,要么再等20小时才能正确提取表单atted文件。看起来像MongoDB数据。尝试将其导出为JSON。格式是(应该是)JSON?如果是,那就提出来。不要只是在代码中突然使用JSON方法,并期望读者猜出原因。如果不是JSON,那就不要使用JSON方法。它通常是JSON格式,但我昨晚做了错误的提取,我对ruby一无所知。要么请你们帮忙,要么再等20小时才能正确提取表单atted文件。看起来像MongoDB数据。尝试将其导出为JSON。