如何在没有类型映射的情况下解析ruby中的yaml

时间:2012-05-31 09:14:08

标签: ruby mapping yaml zipcode

我想从yaml(PHPMyAdmin)中的Mysql转储中获取数据,但数据不是用引号括起来的。

我的邮政编码可以从0开始,解析后我得到十进制版本的八进制值,代替简单的字符串。

如何强制Yaml解析器不进行自动映射,或只是获取所有数据,因为它们是字符串?

由于

== UPDATE ==

2185:
 id: 3274  
 civility: Mr  
 address: CROIX DES COMBES  
 zipcode: 04270

1 个答案:

答案 0 :(得分:4)

如果你的zipcode值是字符串,它们可能应该在数据库中,并且它们被正确转换为YAML,那么它们将被Ruby的YAML解析器重新转换回字符串:

require 'yaml'
zip = '01234'

如果我们将其视为字符串,则会正确转换。

zip.to_yaml # => "--- \"01234\"\n"
YAML.load(zip.to_yaml) # => "01234"

如果我们将其视为一个整数,它的前导0会被删除,这是我所期待的。

zip.to_i.to_yaml # => "--- 1234\n"
YAML.load(zip.to_i.to_yaml) # => 1234

在您的样本中:

zipcode: 04270

zipcode是YAML整数。它应该用引号括起来以保持其“字符串”。

Wikipedia's YAML article有一个很好的例子,说明了数据类型应该如何消除歧义。


你可以调整YAML中zipcode的所有实例,然后再解析它:

require 'yaml'

yaml_data = '2185:
 id: 3274  
 civility: Mr  
 address: CROIX DES COMBES  
 zipcode: 04270
'

yaml_data.gsub(/zipcode: (\d+)/, 'zipcode: "\1"') 
# => "2185:\n id: 3274  \n civility: Mr  \n address: CROIX DES COMBES  \n zipcode: \"04270\"\n"

YAML.load(yaml_data.gsub(/zipcode: (\d+)/, 'zipcode: "\1"')) 
# => {2185=>{"id"=>3274, "civility"=>"Mr", "address"=>"CROIX DES COMBES", "zipcode"=>"04270"}}