मैं रूबी में एक 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

लेकिन यह काम नहीं करता है और मुझे एक त्रुटि देता है कि मूल्य शून्य है।

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
जब आप इसे चलाते हैं तो क्या आप स्क्रिप्ट का आउटपुट दे सकते हैं? सही जगह पर फ़ाइलें? आप हमेशा एक रेल कंसोल को फायर कर सकते हैं और देख सकते हैं कि रूबी उस रास्ते को भी देख सकता है या नहीं।
लुकास

हाँ, फ़ाइल मौजूद है और सही स्थान पर है। Ive ने त्रुटि के साथ मेरी पोस्ट को अपडेट किया।
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 के बारे में यह अद्भुत है - हम कुछ को क्रमबद्ध कर सकते हैं और बाद में इसे वापस पढ़ सकते हैं, इसलिए उस क्षमता का उपयोग क्यों न करें।
टीन मैन

आह, मैं इस बात से अनजान था कि आप एक YAML फ़ाइल के साथ ऐसा कर सकते हैं। बहुत बहुत धन्यवाद!
alvincrespo

1
हुह, यह था क्योंकि मैं टैब का उपयोग कर रहा था। ऐसा लगता है कि यह केवल टैब के बजाय रिक्त स्थान चाहता है, और फिर सभी प्रकार की त्रुटियों को फेंकता है।
FilBot3

3
YAML लाइब्रेरी में # लोड और # लोड_फाइल में क्या अंतर है?
Jwan622

3
YAML.loadएक YAML स्ट्रिंग 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-biles


1
लिंक अब अभ्यास कर
।.com

धन्यवाद @devstuff - मैंने उत्तर में लिंक अपडेट किया है।
सरफता

3

यहाँ एक लाइनर I का उपयोग, टर्मिनल से, 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"}}}}}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.