2010-10-20 24 views
5

मैं रूबी से फाइल YAML करने के लिए डेटा लिख ​​रहा हूँ और मैं अक्सर उपनाम फाइल के बारे में बिंदीदार पाने के बिना रूबी YAML लिखने। चीजों की तरह:उपनाम

- &id001 
    somekey: somevalue 
- *id001 

मेरे मामले में मैं करने के लिए सहायता पठनीयता YAML फ़ाइलों का उपयोग कर रहा हूँ और फाइलों में मूल्यों के नाम जोड़ने के रूप में मौजूदा डेटा कोई कुंजी के साथ सिर्फ | अलग मान है। मैं yaml फ़ाइलों को उपनामों के साथ लिखे जाने से कैसे रोक सकता हूं?

[संपादित करें]

अधिक स्पष्टीकरण के लिए यहाँ डेटा और समस्या के प्रकार का एक उदाहरण है।

मूल डेटा की तरह दिखता है:

Ham|2.00|1 
Eggs|0.50|12 
Milk|2.00|2 

और मैं एक गहरे लाल रंग का स्क्रिप्ट लिखा है YAML करने के लिए, जो भी एक एसक्यूएल फ़ाइल पर लग रहा है उपयुक्त नाम पाने के लिए यह कन्वर्ट करने के लिए।

--- 
- !omap 
    - name: Ham 
    - &id001 
    price: 2.00 
    - quantity: 1 
- !omap 
    - name: Eggs 
    - price: 0.50 
    - quantity: 12 
- !omap 
    - name: Milk 
    - *id001 
    - quantity: 1 

यह बड़े डेटा सेट में एक समस्या का कारण बनता है क्योंकि उपनाम कहीं एक दूसरे के पास हो सकता है और यह यह मुश्किल पढ़ने के लिए बनाता है: YAML फ़ाइल की तरह दिखता है।

+1

आप वर्ग है कि इस YAML को धारावाहिक रूप हो जाता है पोस्ट कर सकते हैं: इस प्रश्न पर

require 'json' jsonObj = oldYaml.to_json newYaml = YAML.load(jsonObj) print newYaml.to_yaml 

एक ही जवाब? –

+0

यह एक वर्ग धारावाहिक नहीं है, यह वाईएएमएल :: ओमैप की एक सरणी है। उम्मीद है कि उदाहरण इसे स्पष्ट बनाता है। –

उत्तर

2

आप वाईएएमएल :: ओमैप का उपयोग क्यों कर रहे हैं?

एक बहुत सरल और क्लीनर समाधान होगा पहले जैसे, हैश की एक सरणी में डेटा को पढ़ने के लिए:

a = [ {'name' => 'Ham', 'price' => 2.00, 'quantity' => 1}, 
     {'name' => 'Eggs', 'price' => 0.50, 'quantity' => 12}, 
     {'name' => 'Milk', 'price' => 2.00, 'quantity' => 2} ] 

और फिर बस कार्य करें:

a.to_yaml 

में जिसके परिणामस्वरूप:

--- 
- price: 2.0 
    name: Ham 
    quantity: 1 
- price: 0.5 
    name: Eggs 
    quantity: 12 
- price: 2.0 
    name: Milk 
    quantity: 2 

क्या यह आपके लिए काम करेगा?

+0

किसी बिंदु पर यामल फ़ाइलों को उन पाइप से अलग फ़ाइलों पर वापस लिखा जाता है। इन आदेशों में महत्वपूर्ण है और मैंने पाया कि सामान्य हैश का उपयोग करते समय वस्तुओं का क्रम जुड़ा हो सकता है। –

+0

मुझे लगता है कि आप रूबी 1.8 का उपयोग कर रहे हैं, तो? आप सही हैं, रूबी 1.8 में हैश का आदेश नहीं दिया गया है, इसलिए तत्वों का क्रम बदला जा सकता है। क्या YAML फ़ाइल में प्रासंगिक तत्वों का क्रम है, या केवल पाइप अलग है? यदि ऐसा है, तो आप वाईएएमएल से पाइप से अलग फ़ाइल में कनवर्ट करते समय तत्वों को फिर से व्यवस्थित करने पर विचार कर सकते हैं। –

+0

मैं यह कर सकता था लेकिन क्या यह मेरी समस्या का समाधान करेगा? क्या आपको लगता है कि मैं ओमैप का उपयोग कर रहा हूं यह तथ्य एलियास को जोड़ा जा रहा है? –

1

यह इसलिए होता है क्योंकि आप एक ही दस्तावेज़ में एक ही वस्तु को कई बार outputting रहे हैं। यदि आप उपनाम नहीं चाहते हैं, तो आपको ऑब्जेक्ट्स dup ऑब्जेक्ट्स की आवश्यकता है। निम्नलिखित की तुलना करें:

require 'yaml' 

hash = {'a' => 1} 

puts [hash, hash].to_yaml 
puts 
puts [hash, hash.dup].to_yaml 

आउटपुट:

--- 
- &1 
    a: 1 
- *1 

--- 
- a: 1 
- a: 1 
0

यह उपनाम विस्तार करने के लिए जब YAML बहुत बड़ा है और संरचनाओं नेस्ट है हर वस्तु dup के लिए जटिल हो सकता है।

मैंने उपयोग किया जाने वाला एक सरल (हैकी) दृष्टिकोण यमल को जेसन में परिवर्तित कर दिया गया था। और उसके बाद इसे वापस YAML में परिवर्तित करें। नए वाईएएमएल में उपनाम/एंकर नहीं होते हैं। How to emit YAML in Ruby expanding aliases

संबंधित मुद्दे