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

如何在没有类型映射的情况下解析ruby中的yaml,ruby,mapping,yaml,zipcode,Ruby,Mapping,Yaml,Zipcode,我想从yaml(PHPMyAdmin)中的Mysql转储中获取数据,但数据并没有被引号包围 我有一个zipcode,可以从0开始,解析后我得到十进制版本的八进制值,代替简单的字符串 如何强制Yaml解析器不进行自动映射,或者只获取字符串形式的所有数据 谢谢 ==更新== 2185: id: 3274 civility: Mr address: CROIX DES COMBES zipcode: 04270 如果zipcode值是字符串,它们可能应该在数据库中,并且正确地转换

我想从yaml(PHPMyAdmin)中的Mysql转储中获取数据,但数据并没有被引号包围

我有一个zipcode,可以从0开始,解析后我得到十进制版本的八进制值,代替简单的字符串

如何强制Yaml解析器不进行自动映射,或者只获取字符串形式的所有数据

谢谢

==更新==

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

如果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整数。它应该用引号括起来,以保持其“严密性”

有一个很好的例子,展示了如何消除数据类型的歧义


在解析YAML之前,您可以调整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"}}

您是否可以展示代码示例和正在解析的YAML示例,其中的值没有正确传输?根据我的经验,如果我正确创建YAML,Ruby将正确加载它。我知道,但PhpMyAdmin dump不会在YAML文件中的数据中添加引号,而且我不能手动或使用regexp添加引号。我认为必须能够将解析器配置为以简单字符串的形式获取所有数据,而不是进行类型映射。我只是查看了底层的
syck
docs,没有看到任何东西会告诉它忽略文件中的数据类型。给定提供给解析器的数据,解析器正在做它应该做的事情。由于YAML数据是一个文本文件,您可以加载并预处理它,将zipcode字段转换为字符串,然后解析它。我无法验证您的答案,因为它不是我想要的解决方案,但感谢您的研究。“我无法验证您的答案,因为它不是我想要的解决方案…”需要考虑的事情:有时我们想要的解决方案由于各种原因不实用,甚至不可能。对输入数据进行预处理以使其适合下一步是很常见的;为了能够解析它,我不得不多次处理格式错误的HTML和XML。优雅是令人向往的,但有时我们不得不把它扔出窗外,弄脏我们的手,只是为了完成一些事情。“也许有一天一个新的解析器会做到这一点”。我不确定那会发生。YAML是,而MyPHPAdmin没有生成有效的YAML输出。我想写过YAML解析器的人会说MyPHPAdmin需要修复他们的输出。