Ruby에서 YAML 파일을 어떻게 구문 분석합니까?


210

다음 내용으로 YAML 파일을 구문 분석하는 방법을 알고 싶습니다.

--- 
javascripts: 
- fo_global:
  - lazyload-min
  - holla-min

현재이 방법으로 구문 분석하려고합니다.

@custom_asset_packages_yml = (File.exists?("#{RAILS_ROOT}/config/asset_packages.yml") ? YAML.load_file("#{RAILS_ROOT}/config/asset_packages.yml") : nil)
    if !@custom_asset_packages_yml.nil?
      @custom_asset_packages_yml['javascripts'].each{ |js|
        js['fo_global'].each{ |script|
         script
        }
      }
    end

그러나 작동하지 않는 것 같고 값이 0이라는 오류가 발생합니다.

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

이것을 시도하면 전체 문자열 (fo_globallazyload-minholla-min)을 내 보냅니다.

if !@custom_asset_packages_yml.nil?
          @custom_asset_packages_yml['javascripts'].each{ |js|
            js['fo_global']
          }
        end

1
스크립트를 실행할 때 출력을 줄 수 있습니까? 올바른 위치에 파일이 있습니까? 항상 Rails 콘솔을 실행하여 루비가 해당 경로를 볼 수 있는지 확인할 수 있습니다.
Lukas

예, 파일이 존재하고 올바른 위치에 있습니다. 내 게시물을 오류로 업데이트했습니다.
alvincrespo

답변:


449

어쩌면 내가 뭔가를 잃어 버렸지 만 파일을 파싱하려고하는 이유는 무엇입니까? YAML을로드하고 결과 객체를 검사하는 것이 어떻습니까?

샘플 YAML이에 있으면 some.yml다음과 같습니다.

require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect

나에게 준다

{"javascripts"=>[{"fo_global"=>["lazyload-min", "holla-min"]}]}

9
YAML의 훌륭한 점이라고 동의합니다. 무언가를 직렬화 한 다음 나중에 다시 읽을 수 있으므로 해당 기능을 사용하지 않는 것이 좋습니다.
Tin Man

아, YAML 파일로 그렇게 할 수 있다는 것을 몰랐습니다. 정말 고마워!
alvincrespo

1
허, 탭을 사용했기 때문입니다. 탭 대신 공백 만 원한 다음 모든 종류의 오류가 발생합니다.
FilBot3

3
YAML 라이브러리에서 #load와 #load_file의 차이점은 무엇입니까?
Jwan622

3
YAML.loadYAML 문자열, YAML.load_file상대 파일 경로를 사용합니다.
Narfanator

11

나는 같은 문제가 있었지만 파일의 내용을 얻고 싶었습니다 (YAML 정면 문제 이후).

이것이 내가 찾은 최고의 솔루션입니다.

if (md = contents.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m))
  self.contents = md.post_match
  self.metadata = YAML.load(md[:metadata])
end

출처 및 토론 : https://practicingruby.com/articles/tricks-for-working-with-text-and-files


1
링크는 이제
ruby.com/articles/…를

감사합니다 @devstuff-답변의 링크를 업데이트했습니다.
sarfata

3

다음은 터미널에서 yml 파일의 내용을 테스트하기 위해 사용하는 하나의 라이너입니다.

$ ruby  -r yaml -r pp  -e 'pp YAML.load_file("/Users/za/project/application.yml")'
{"logging"=>
  {"path"=>"/var/logs/",
   "file"=>"TacoCloud.log",
   "level"=>
    {"root"=>"WARN", "org"=>{"springframework"=>{"security"=>"DEBUG"}}}}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.