"Foo: XXXX" - रूबी वाले एक सिंगल लाइन स्ट्रिंग को निकालें

मेरे पास एक या एक से अधिक कुंजी: मान रेखाओं के साथ एक फ़ाइल है, और मैं एक कुंजी खींचना चाहता हूं: मान = फू। मैं यह कैसे कर सकता हूँ?

मैं इस तक पहुँच सकता हूँ:

if File.exist?("/file_name")
content = open("/file_name").grep(/foo:??/)

मैं grep भाग के बारे में अनिश्चित हूं, और एक बार सामग्री प्राप्त करने के बाद, मैं मूल्य कैसे निकालूं?

उत्तर:

उत्तर № 1 के लिए 1

लोग फाइलों को स्मृति में खिसकाना पसंद करते हैं,जो, यदि फ़ाइल हमेशा छोटी होगी, एक उचित समाधान है। हालांकि, slurping isn "t स्केलेबल, और अभ्यास से अत्यधिक सीपीयू और I / O प्रतीक्षा हो सकती है क्योंकि सामग्री पढ़ी जाती है

इसके बजाय, क्योंकि आपके पास एक फ़ाइल में कई हिट हो सकते हैं, और आप "सामग्री लाइन-दर-पंक्ति की तुलना कर रहे हैं, इसे लाइन-बाय-लाइन पढ़ सकते हैं। लाइन I / O बहुत तेज़ है और स्केलेबिलिटी समस्याओं से बचाती है। रूबी"। File.foreach जाने का रास्ता है:

File.foreach("path/to/file") do |li|
puts $1 if li[/foo:s*(w+)/]
end

क्योंकि वास्तविक कुंजी / मूल्य जोड़े के कोई नमूने नहीं हैं, हम "वैध रेगेक्स पैटर्न के लिए अंधेरे में शूटिंग कर रहे हैं, लेकिन यह इस आधार पर है कि मैं कैसे समस्या का समाधान करता हूं।"


जवाब के लिए 0 № 2

इसे इस्तेमाल करे:

IO.readlines("key_values.txt").find_all{|line| line.match("key1")}

जवाब के लिए 0 № 3

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

regex = /As?keys?:/
results = File.readlines("file").inject([]) do |f,l|
l =~ regex ? f << "key = %s" % l.sub(regex, "") : f
end

इससे शुरू होने वाली रेखाओं का पता लगाया जाएगा key: और उन्हें परिणामों की तरह जोड़ना key = value,
कहा पे value भाग के बाद जा रहा है key:

तो अगर आपके पास इस तरह की फाइल है:

key:1
foo
key:2
bar
key:3

आप इस तरह से परिणाम प्राप्त करेंगे:

key = 1
key = 2
key = 3

समझ में आता है?


जवाब के लिए 0 № 4
value = File.open("/file_name").read.match("key:(.*)").captures[0] rescue nil

जवाब के लिए 0 № 5
File.read("file_name")[/foo: (.*)/, 1]
#=> XXXX

संबंधित सवाल
सबसे लोकप्रिय