2011-09-29 10 views
5

मेरे पास दो टेक्स्ट फ़ाइलें, master.txt और 926.txt हैं। यदि 926.txt में कोई पंक्ति है जो master.txt में नहीं है, तो मैं एक नई फ़ाइल, notinbook.txt पर लिखना चाहता हूं।दो टेक्स्ट फ़ाइलों की तुलना करने की कोशिश कर रहा है, और जानकारी के आधार पर एक तिहाई बनाएँ

मैंने सबसे अच्छी चीज लिखी जिसे मैं सोच सकता था, लेकिन यह देखते हुए कि मैं एक भयानक/नौसिखिया प्रोग्रामर हूं, यह असफल रहा। यहां मेरे पास

g = File.new("notinbook.txt", "w") 
File.open("926.txt", "r") do |f| 
    while (line = f.gets) 
    x = line.chomp 
    if 
     File.open("master.txt","w") do |h| 
     end 
     while (line = h.gets) 
     if line.chomp != x 
      puts line 
     end 
     end 
    end 
    end 
end 
g.close 

बेशक, यह विफल हो जाता है। धन्यवाद!

+0

मैं विचार बनाए रखने के लिए ताकि आप देख सकते हैं (! आप करीब थे) https क्या कमी है की कोशिश कर अपना कोड संशोधित मदद करता है: // gist.github.com/1252609 हालांकि ऐसा करने का मतलब है कि कई बार master.txt की एक ही पंक्ति के माध्यम से चल रहा है, इसलिए यह कुशल नहीं है लेकिन यह काम पूरा हो जाता है। – derp

उत्तर

0

उपयोग: http://raa.ruby-lang.org/project/compare/

या

% x (diff file1 file2)

या

http://github.com/myobie/htmldiff/

+0

लेकिन अगर मैं लेखक को सही ढंग से समझता हूं, तो वह बदलावों के लिए भिन्नता की कोशिश नहीं कर रहा है, लेकिन किसी दिए गए फ़ाइल की रेखाएं किसी और में मौजूद हैं या नहीं? – JamesDS

1

आप कुछ इस तरह कर सकते हैं:

master_lines = [] 
File.open("notinbook.txt","w") do |result| 
    File.open("master.txt","r") do |master| 
    master.each_line do |line| 
     master_lines << line.chomp 
    end 
    end 

    File.open("926.txt","r") do |query| 
    query.each_line do |line| 
     if !master_lines.include? line.chomp 
     result.puts line.chomp 
     end 
    end 
    end 
end 
12

यह काम करना चाहिए:

f1 = IO.readlines("926.txt").map(&:chomp) 
f2 = IO.readlines("master.txt").map(&:chomp) 

File.open("notinbook.txt","w"){ |f| f.write((f1-f2).join("\n")) } 

यह मेरा परीक्षण किया गया था:

926.txt

line1 
line2 
line3 
line4 
line5 

master.txt

line1 
line2 
line4 

notinbook.txt

line3 
line5 
+0

उत्कृष्ट उत्तर ... –

+0

कमाल का जवाब। –

0

आशा इस

dir = File.dirname(__FILE__) 
notinbook = "#{dir}/notinbook.txt" 
master = "#{dir}/master.txt" 
f926  = "#{dir}/926.txt" 

def file_into_ary(file) 
    ary = [] 
    File.open(file).each{ |line| ary << line } 
    return ary 
end 

def write_difference(file, diff) 
    File.open(file, 'w') do |file| 
    diff.each do |line| 
     file.write(line) 
    end 
    end 
end 

diff = file_into_ary(f926) - file_into_ary(master) 
write_difference(notinbook, diff) unless diff.empty? 
संबंधित मुद्दे