2012-04-24 22 views
6

क्या कोई रूबी टूल है जो मुझे (संक्षेप में => एआरबी) के प्रारूप में संक्षिप्ताक्षर की फ़ाइल लोड करने की अनुमति देगा? तब मुझे एक और फाइल से प्रत्येक शब्द को पढ़ने की जरूरत है। यदि शब्द संक्षेप में शब्द से मेल खाता है तो मुझे इसे संक्षिप्त शब्द में बदलने की आवश्यकता है। मुझे लगता है कि मैं हैश का उपयोग कर सकता हूं लेकिन मुझे नहीं पता कि इसे फ़ाइल से कैसे लोड किया जाए।रूबी: फ़ाइल से हैश कैसे लोड करें?

उत्तर

21

YAML डेटा को संग्रहीत करने के लिए एक बहुत ही सार्वभौमिक प्रारूप है जिसे ऐप्स और प्रोग्रामिंग भाषाओं के बीच स्थानांतरित किया जा सकता है। JSON एक और वैकल्पिक है, जो वेब साइटों में बहुत आम है।

मैं कॉन्फ़िगरेशन फ़ाइलों जैसी चीजों के लिए वाईएएमएल का उपयोग करता हूं क्योंकि इसे बहुत आसानी से पढ़ा और संशोधित किया जाता है। उदाहरण के लिए, इस रूबी संरचना:

irb(main):002:0> foo = { 'a' => 1, 'b' => [2, 3], 'c' => { 'd' => 4, 'e' => 5 } } 
{ 
    "a" => 1, 
    "b" => [ 
     [0] 2, 
     [1] 3 
    ], 
    "c" => { 
     "d" => 4, 
     "e" => 5 
    } 
} 

इस तरह लग रहा है जब YAML में बदला:

irb(main):003:0> puts foo.to_yaml 
--- 
a: 1 
b: 
- 2 
- 3 
c: 
    d: 4 
    e: 5 

आप एक फ़ाइल है कि बचत हो सकती है:

File.open('foo.yaml', 'w') { |fo| fo.puts foo.to_yaml } 

और उसे वापस पढ़ें:

bar = YAML.load_file('foo.yaml') 
{ 
    "a" => 1, 
    "b" => [ 
     [0] 2, 
     [1] 3 
    ], 
    "c" => { 
     "d" => 4, 
     "e" => 5 
    } 
} 

इसी प्रकार y, JSON का उपयोग कर:

puts foo.to_json 
{"a":1,"b":[2,3],"c":{"d":4,"e":5}} 

आप की तरह आप YAML के साथ होता है एक फाइल करने के लिए JSON बचा सकता है और फिर इसे फिर से लोड करके उसे फिर से चालू हैश में। यह थोड़ी अलग वाक्य रचना हालांकि:

irb(main):011:0> File.open('foo.json', 'w') { |fo| fo.puts foo.to_json } 
nil 
irb(main):012:0> bar = JSON.parse(File.read('foo.json')) 
{ 
    "a" => 1, 
    "b" => [ 
     [0] 2, 
     [1] 3 
    ], 
    "c" => { 
     "d" => 4, 
     "e" => 5 
    } 
} 

बड़ी जीत किसी के साथ किसी भी भाषा कि YAML पढ़ सकते हैं या JSON उन फ़ाइलों को पढ़ सकते हैं और डेटा का उपयोग कर सकते हैं, या तो पढ़ने या इसे लिखने है।

स्ट्रिंग प्रतिस्थापन करना आपके पास हैश होने के बाद बहुत आसान है, क्योंकि रुबी स्ट्रिंग का gsub हैश समझता है। , दूसरा तर्क एक हैश है, और मिलान वाला पाठ अपनी कुंजियों में से एक है, तो

संबंधित मान प्रतिस्थापन स्ट्रिंग है: यह the docs से है।

इसका मतलब है आप कुछ इस तरह कर सकते हैं:

foo = 'Jackdaws love my giant sphinx of quartz' 
bar = { 'quartz' => 'rosy quartz', 'sphinx' => 'panda' } 
foo.gsub(Regexp.union(bar.keys), bar) 
"Jackdaws love my giant panda of rosy quartz" 

आप शब्द सीमा टकराव प्रतिस्थापन करने के लिए बाहर देखने के लिए करते हैं, लेकिन एक पैटर्न में \b झंडा सहायक हो सकता है। वह काम करना पाठक के लिए एक अभ्यास है।

+0

हालांकि यह एक अच्छा स्पष्टीकरण है, मैं तर्क दूंगा कि यमल या जेसन में लाने से केवल एक साधारण अभ्यास जटिल हो जाता है। फ़ाइल पहले से मौजूद है, और यह पहले से ही जितनी सरल हो उतनी सरल है - एक सीमित पाठ फ़ाइल, प्रति पंक्ति एक रिकॉर्ड। फ़ाइल को बस लाइन से पढ़ें, इसे विभाजित करें, और हैश बनाएं। – Jim

+0

धन्यवाद! यह अभी सही काम करता है। – user1128637

8

Marshal.load और Marshal.dump देखें।

इसके अलावा, आप हैश को यम फ़ाइल में क्रमबद्ध करने और फिर इसे YAML के माध्यम से वापस सहेजने/सहेजने में देख सकते हैं।

+0

'मार्शल' प्रारूप उपयोग में रूबी संस्करण के लिए विशिष्ट (या हो सकता है) है और संस्करणों के मेल नहीं होने पर 'मार्शल' डेटा पढ़ने के लिए कोई (सनी) तरीका नहीं है। यह धारा में क्रमिकरण के लिए एक खराब प्रारूप बनाता है। –

0

मुझे यह http://www.rubydoc.info/gems/bosh-director/1.1868.0/Bosh%2FDirector%2FConfig.load_hash मिला है जो खुद को हैश लोड करने के तरीके को देखने के बाद मिला।

मेरा उदाहरण एक रेल ऐप में मोंगोडीबी से निपटने पर है।

इसलिए मैंने संग्रह प्राप्त करने के लिए एक प्रारंभिक विधि सेट की है जिसके साथ मैं काम करने जा रहा हूं।

def initialize @collection = self.class.collection end

self.class यहाँ वर्ग मैंने कर लिया है। एक उदाहरण के रूप में लोग उपयोग करते हैं।

लोड विधि निम्नलिखित

def load_collection(file_path) 
    hash_values = self.class.load_hash(file_path) 
    @collection.insert_many(hash) 
end 
एक binding.pry

[1] pry(#<People>)> file_path 
=> "people_results.json" 
[2] pry(#<People>)> hash 
=> [{"number"=>0, "first_name"=>"SHAUN", "last_name"=>"JOHNSON", "gender"=>"M", "group"=>"15 to 19", "secs"=>1464}, {"number"=>1, "first_name"=>"TUAN", "last_name"=>"JOHNSON", "gender"=>"M", "group"=>"masters", "secs"=>3994}, {"number"=>2, "first_name"=>"EARLINE", "last_name"=>"BROWN", "gender"=>"F", "group"=>"masters", "secs"=>1415}... 
[3] pry(#<People>)> self 
=> #<People:0x007fc80301b5f8 @coll=#<Mongo::Collection:0x70248510355560 namespace=test.people>> 
[4] pry(#<People>)> self.class 
=> People 
इस मामले load_hash विधि एक पैरामीटर लेता में

तो अंदर

है, और इस मामले में मैं एक json में पारित कुछ डेटा के साथ फ़ाइल करें। फिर मैं उस डेटा को अपने संग्रह में डालता हूं।

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