【问题标题】:How to parse yaml in ruby without type mapping如何在没有类型映射的情况下解析 ruby​​ 中的 yaml
【发布时间】:2012-05-31 09:14:07
【问题描述】:

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

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

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

谢谢

== 更新 ==

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

【问题讨论】:

  • 您能否展示您的代码示例和正在解析的 YAML 示例,其中值未正确传输?根据我的经验,如果我正确创建了 YAML,Ruby 将正确加载它。

标签: ruby mapping yaml zipcode


【解决方案1】:

如果您的邮政编码值是字符串,它们可能应该在数据库中,并且它们被正确转换为 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"}}

【讨论】:

  • 我知道,但是 PhpMyAdmin 转储不会在 YAML 文件中的数据中添加引号,并且我无法手动或使用正则表达式添加引号。我认为必须可以配置解析器以将所有数据作为简单字符串而不进行类型映射
  • 我只是查看了底层的syck 文档,并没有看到任何可以告诉它忽略文件中数据类型的内容。鉴于提供给它的数据,解析器正在做它应该做的事情。由于 YAML 数据是一个文本文件,您可以对其进行加载和预处理,将 zipcode 字段转换为字符串,然后对其进行解析。
  • 我无法验证您的答案,因为这不是我想要的解决方案,但感谢您的研究。
  • “我无法验证您的答案,因为它不是我想要的解决方案......” 需要考虑的事情:有时我们想要的解决方案不切实际,甚至可能由于各种原因.预处理传入的数据以使其适合下一步是很常见的;为了能够解析它,我不得不多次处理格式错误的 HTML 和 XML。优雅是可取的,但有时我们不得不把它扔出窗外,弄脏我们的手,只是为了完成一些事情。
  • “也许有一天新的解析器会这样做”。我不确定这会发生。 YAML 是 well documented standard,而 MyPHPAdmin 没有生成有效的 YAML 输出。我想写过 YAML 解析器的人会说 MyPHPAdmin 需要修复他们的输出。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2018-12-20
  • 2011-06-29
相关资源
最近更新 更多