का उपयोग कर एक टेक्स्ट फ़ाइल लाइन-वार पढ़ें, संपादित करें और लिखें, क्या रूबी में फ़ाइलों को पढ़ने, संपादित करने और लिखने का कोई अच्छा तरीका है?रुबी
मेरी ऑनलाइन खोज में मुझे यह सब कुछ एक सरणी में पढ़ने के लिए सुझाव दिया गया है, कहा गया सरणी संशोधित करें, फिर सब कुछ लिखें। मुझे लगता है कि एक बेहतर समाधान होना चाहिए, खासकर अगर मैं एक बहुत बड़ी फाइल से निपट रहा हूं।
कुछ की तरह:
myfile = File.open("path/to/file.txt", "r+")
myfile.each do |line|
myfile.replace_puts('blah') if line =~ /myregex/
end
myfile.close
कहाँ replace_puts
वर्तमान पंक्ति के बजाय (अधिक) अगली पंक्ति लिख के रूप में यह वर्तमान में विभाजक के बाद क्योंकि सूचक लाइन के अंत में है करता है (से अधिक लिखते थे)।
तो /myregex/
से मेल खाने वाली प्रत्येक पंक्ति को 'ब्ला' के साथ बदल दिया जाएगा। जाहिर है कि मेरे मन में जो कुछ है, उससे थोड़ा अधिक शामिल है, जहां तक प्रसंस्करण है, और एक पंक्ति में किया जाएगा, लेकिन विचार वही है - मैं लाइन द्वारा एक फ़ाइल लाइन पढ़ना चाहता हूं, और कुछ पंक्तियों को संपादित करना चाहता हूं, और जब मैं कर रहा हूँ लिखो।
शायद कहने का एक तरीका है कि "अंतिम विभाजक के ठीक बाद वापस लौटें"? या each_with_index
का उपयोग करने और लाइन इंडेक्स नंबर के माध्यम से लिखने का कोई तरीका? हालांकि, मुझे इस तरह के कुछ भी नहीं मिला।
मेरे पास अब तक का सबसे अच्छा समाधान चीजों को लाइन-वार पढ़ने के लिए है, उन्हें एक नई (अस्थायी) फ़ाइल लाइन-वार (संभवतः संपादित) में लिखें, फिर पुरानी फ़ाइल को नई temp फ़ाइल के साथ ओवरराइट करें और हटाएं। दोबारा, मुझे लगता है कि एक बेहतर तरीका होना चाहिए - मुझे नहीं लगता कि मुझे मौजूदा 1 जीबी फ़ाइल में कुछ लाइनों को संपादित करने के लिए सिर्फ एक नई 1gig फ़ाइल बनाना होगा।
परिणामों पर विचार करें यदि आपके कोड को पढ़ने के बाद ओवरराइट किया गया था, प्रक्रिया के माध्यम से भागने में असफल रहे: आप फ़ाइल को नष्ट करने का जोखिम चलाते हैं। –
ठीक है, एक फॉलो-अप प्रश्न के रूप में: कमांड लाइन से, आप यह कर सकते हैं: ruby -pe "gsub (/ blah /, 'newstuff')" whatev.txt। यही वह है जो मैं करना चाहता हूं, लेकिन मैं इसे कमांड लाइन पर नहीं करना चाहता, मैं इसे कुछ बड़े अंदर रखना चाहता हूं। क्या कोई मुझे बता सकता है, आंतरिक रूप से, वह आदेश क्या कर रहा है जो फ़ाइल को संपादित करने का भ्रम देता है, लाइन से लाइन? क्या यह एक अस्थायी फ़ाइल, या सरणी का उपयोग कर रहा है? क्योंकि यह अब तक बहुत बड़ी फ़ाइलों पर काम करता प्रतीत होता है, यहां तक कि यहां दिए गए सुझावों की तुलना में मोरेसो। – Hsiu
यह एक अच्छा सवाल है। क्या आप इसे एक नए प्रश्न में बना सकते हैं? इससे दूसरों को इसे देखने और इसका उत्तर देने में बहुत आसान बनाता है।इसके अलावा, अगर इस प्रश्न का आपकी संतुष्टि का उत्तर दिया गया था, तो क्या आप उस उत्तर को स्वीकार कर सकते हैं? धन्यवाद! –