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

दस्तावेज़ १

दस्तावेज़ का शीर्षक
(टीओडी)

रिलीज 3
संस्करण 2

लेखकों

थॉमस ई. थॉमस, जॉन एल. जॉन,
फ्रेड ए। फ्रेड, सैंड्रा के। सैंड्रा

कंपनी ए पता

अधिक लेखक

पेज 3

इस उदाहरण से मुझे "दस्तावेज़ का शीर्षक (टीओडी)", 3, 2, और लेखकों और पृष्ठ 3 के बीच के सभी पाठों की आवश्यकता है, समावेशी नहीं। मैं धीरे-धीरे सीख रहा हूं इसलिए मेरे पास कुछ कोड स्निपेट हैं, लेकिन वे काफी दूर नहीं जाते हैं। मुझे एक मैच मिल सकता है लेकिन पहले उदाहरण और उदाहरण और अगली पंक्ति की आवश्यकता है:

File.open("sample.txt").each do |line|
    if line[/Document/]
        puts line

मैंने मध्यवर्ती पाठ प्राप्त करने का प्रयास किया है लेकिन यह बिल्कुल सही नहीं है:

File.open("sample.txt").each do |line|
while gets
  print if [/Authors/../Page/]
end

अगर आपको लगता है कि यह पूछने में बहुत अधिक मदद है तो मैं संकेत/पॉइंटर्स की सराहना करता हूं।

2
chuckfinley 3 नवम्बर 2011, 04:22
1
जब तक आप "पेज 3" लाइन को हिट नहीं करते, तब तक क्या आप केवल आउटपुट लाइन नहीं कर सकते?
 – 
Dave Newton
3 नवम्बर 2011, 05:41
आपको राज्य-आधारित दृष्टिकोण का उपयोग करने की आवश्यकता है। ट्रैक करें कि आप किस 'स्टेट' में हैं, और प्रत्येक पंक्ति के लिए एक case स्टेटमेंट का उपयोग करके तय करें कि आपको क्या देखना है और क्या करना है, और स्टेट वेरिएबल को एक नए मान में बदलने के लिए ( शायद एक प्रतीक) जब वह कुछ और देखता है।
 – 
Phrogz
3 नवम्बर 2011, 08:54

1 उत्तर

सबसे बढ़िया उत्तर

फ़ाइल लाइन को लाइन से पढ़ने के बजाय मुझे लगता है कि पूरी चीज को पढ़ना आसान होगा, फिर इसे रेगेक्स के साथ खोजें। कुछ इस तरह:

File.open("sample.txt","r") do |f|
  text = f.read

  # everything between Document and Authors
  m1 = text.match(/Document(.*)Authors/m)

  # everything between Authors and Page
  m2 = text.match(/Authors(.*)Page/m)
end
4
Dty 3 नवम्बर 2011, 11:59
आप इसके लिए m रेगेक्स संशोधक का उपयोग करना चाहेंगे (यह . न्यूलाइन वर्णों से मेल खाता है)। रूबी में w मान्य रेगेक्स विकल्प नहीं है।
 – 
Michael Kohl
3 नवम्बर 2011, 11:56