2009-02-14 16 views
7

मैं एक फ़ाइल इनपुट निम्नलिखित सामग्री है कि मिल गया है:एसटीडीआईएन सामग्री को एक सरणी में कैसे परिवर्तित करें?

123\n 
456\n 
789 

मैं तो जैसे मेरी स्क्रिप्ट चलाना चाहते हैं: script.rb < इनपुट और यह एक सरणी के लिए इनपुट फ़ाइल की सामग्री को परिवर्तित किया है, नए लाइन चरित्र पर विभाजित। तो, मेरे पास myArray = [123,456,789] की तरह कुछ होगा। यहाँ मैं क्या करने की कोशिश की है और बहुत किस्मत होने नहीं कर रहा हूँ है:

myArray = STDIN.to_s 
myArray.split(/\n/) 
puts field.size 

मैं 3 मुद्रित करने के लिए इस उम्मीद कर रहा हूँ, लेकिन मैं 15. मैं वास्तव में यहाँ भ्रमित कर रहा हूँ हो रही है। कोई संकेतक?

+0

ओई vey। तीसरी पंक्ति वास्तव में कहती है myArray.size डालता है। प्रश्न में टाइपो, कोड नहीं। – miketaylr

+0

@ माइक: तो सवाल संपादित करें ... – womble

उत्तर

20

आप

myArray = $stdin.readlines 

चाहते कि $ stdin के सभी एक सरणी प्रविष्टि के साथ एक सरणी में मिल जाएगा के बाद कर रहे हैं क्या इनपुट की प्रति पंक्ति।

ध्यान दें कि यह शानदार अक्षम है (स्मृति वार) बड़े इनपुट फाइलों के साथ है, तो आप दूर बेहतर कर रहे हैं की तरह कुछ का उपयोग कर:

$stdin.each_line do |l| 
    ... 
end 
बजाय

a = $stdin.readlines 
a.each do |l| 
    ... 
end 

क्योंकि पूर्व नहीं करता है सब कुछ आगे के लिए स्मृति आवंटित नहीं करते हैं। एक बहु-गीगाबाइट लॉग फ़ाइल को प्रोसेस करने का प्रयास करें कि यह देखने के लिए कि आपका सिस्टम का स्वैप प्रदर्शन कितना अच्छा है ... < grin>

1

अपने है का उपयोग कर$stdin बजाय $ stdin.to_s

ruby -e 'p $stdin.readlines.size' < INPUT 
3 

ruby -e 'p $stdin.to_s' 
"#<IO:0x7fc7cc578af0>" 
1

STDIN.lines आलसी है, लेकिन आपको चारों ओर घूमने के लिए एक सरणी जैसी संरचना देता है ऊपर।

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