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 に答える