3

我正在使用 Ruby 1.9.3,并且我有一个由另一个程序生成的 YAML 文件,我需要对其进行解析。Ruby YAML 解析器似乎无法识别%YAML:1.0,这只是 YAML 版本的一个指标。

这是我的 YAML 文件:

%YAML:1.0
task_name: "1000022_es-2013-03-19-12-00-00_1_90000_s1.vtsk"
worker_name: "1000022_es-2013-03-19-12-00-00_1_90000_s1.vtsk"
left_labels: !!opencv-matrix
   rows: 8
   cols: 1
   dt: f
   data: [ 8., 6., 2., 7., 8., 4., 10., 4. ]
right_labels: !!opencv-matrix
   rows: 8
   cols: 1
   dt: f
   data: [ 14., 6., 12., 7., 7., 4., 5., 1. ]
left_features: !!opencv-matrix
   rows: 8
   cols: 2
   dt: f
   data: [ 4692611., 12., 2.81733875e+06, 12., 2.99522725e+06, 12.,
       4.00128050e+06, 12., 3.84592175e+06, 12., 2006966., 12.,
       4.47367050e+06, 12., 9.56887875e+05, 0. ]
right_features: !!opencv-matrix
   rows: 8
   cols: 2
   dt: f
   data: [ 4692611., 12., 2.81733875e+06, 12., 2.99522725e+06, 12.,
       4.00128050e+06, 12., 3.84592175e+06, 12., 2006966., 12.,
       4.47367050e+06, 12., 9.56887875e+05, 0. ]

当我这样做时:

require 'yaml'
Psych.load(File.read('myfile.yaml'))

我收到此错误:

Psych::SyntaxError: (): 无法在第 0 行第 5 列解析 YAML

如果我%YAML:1.0从文件中删除,那么一切都很好。

4

2 回答 2

3

看起来 Ruby 库没有正确处理YAML 1.0 YAML 指令。据我所知,Psych 2.0.0 只为版本 1.1 ( %YAML 1.1) 显式处理 YAML 指令;%YAML:1.0它在和上失败%YAML 1.2。(从 1.1 版开始,冒号已从指令语法中删除。)

这对我来说意味着 Psych 2.0.0 仅与 YAML 1.1 兼容,但由于文件的其余部分似乎是有效的 YAML 1.X,因此删除不兼容的指令可以避免问题。

您的选择似乎是:

  1. 让其他程序输出 YAML 1.1,
  2. 提前从文件顶部删除指令,或者
  3. 在将指令传递给 Psych 进行解析之前,从缓冲区中剥离指令。
于 2013-07-10T07:04:15.970 回答
-1

你可以gem install syck,那么require 'syck'。这是一个例子

  require 'syck'
  # YAML::ENGINE.yamler = 'syck'
  fp=File.open(file)
  fp.gets # remove the first line
  YAML.load(fp)
于 2016-10-05T06:28:56.490 回答