2011-02-22 80 views
0

我的MAC地址在mac1.txt和mac2.txt,我想這樣做:把比賽從到文件

v = File.open("/RubyDev/sort/mac1.txt",'r').each_line do |a| 
     w = File.open("/RubyDev/sort/mac2.txt",'r').each_line do |b| 
      if w in v 
       puts w 
      end 
     end 
end 

預先感謝您的幫助!

回答

1

編輯:下面的第一個版本實際上是非常可怕的。這裏有一個更好的版本:

lines = [] 

File.open("mac1.txt",'r').each_line do |a| 
    lines.push(a.rstrip!) 
end 

File.open("mac2.txt",'r').each_line do |b| 
    if lines.include?(b.rstrip!) 
    puts b 
    end 
end 

我想你要尋找的是這樣的:

File.open("mac1.txt",'r').each_line do |a| 
    File.open("mac2.txt",'r').each_line do |b| 
    if a == b 
     puts b 
    end 
    end 
end 

是正確的嗎?如果不是,你能否提供更多關於這個問題的背景以及你想要完成什麼?

+0

陣列#包括是不是很有效。基於散列的解決方案更勝一籌。另外,你不需要第一個文件中的bang-method。 – 2011-02-23 01:03:09

+0

這兩個公平點。在我看到它之前,我甚至沒有考慮過基於哈希的比較思想。當我談到Ruby時,我很綠,所以我不知道'include?'效率低下。謝謝! – 2011-02-23 01:07:31

+0

這不是'include?'本身效率低下,但是掃描匹配元素的數組是O(n),而哈希查找是O(1)。 – 2011-02-23 02:18:33

1

我還在努力學習Ruby,所以這不太可能是一個好的解決方案,但它是一種可能性。它將第一個文件的內容讀入散列,然後檢查第二個文件的內容。我認爲這將是相當有效的(呃...除非第一個文件太大而不能很好地適應內存)。

lines = Hash.new 

File.open("mac1.txt", 'r').each_line do |l| 
    lines[l] = true 
end 

File.open("mac2.txt", 'r').each_line do |l| 
    if (lines[l] == true) 
     puts l 
    end 
end 

編輯爲了完整起見,這裏是非常簡潔的版本,如馬克 - 托馬斯空白去除由加文安德瑞格提出的意見建議。 Ruby是一種甜蜜的語言。

lines = Hash.new 
File.open("mac1.txt", 'r').each_line {|l| lines[l.strip!] = true} 
File.open("mac2.txt", 'r').each_line {|l| puts l if lines[l.strip!]} 
+1

還不錯。 Readmode是默認的,所以你可以用'File.open(「mac1.txt」)替換第一部分。each_line {| l |行[l] = true}'。第二個可以是'File.open(「mac2.txt」)。each_line {| l |把l如果行[l]}' – 2011-02-23 00:31:04

+0

呵呵!這真的很乾淨!但它仍然遭受「\ n」v。「EOF」問題。也許這樣? 1:'lines = Hash.new' 2: 'File.open(「mac1.txt」)。each_line {| l | lines [l.rstrip!] = true}'3: 'File.open(「mac2.txt」)。each_line {| l |放行如果行[l.rstrip!]}' – 2011-02-23 00:47:38

+1

@Gavin,我會使用行[l.chomp]'但這只是個人喜好。 – 2011-02-23 00:54:35

1

要獲取的所有共同線兩個文件之間,您可以使用File#readlines訪問所有文件中的行作爲一個數組。請記住,它們仍然會附加換行符(「\ n」),因此您需要使用String#chomp將其刪除。要做到這一點,最簡單的方法是map的數組readlines給你,就像這樣:

common_macs = File.open("mac1.txt").readlines.map(&:chomp) & 
    File.open("mac2.txt").readlines.map(&:chomp) 
+0

很好的解釋,但我不知道它是如何計算常見的mac。 – 2011-02-23 00:33:11

+0

哎呀,應該是'&'。 – harbichidian 2011-02-23 00:35:35

0
lines = {} 
File.open("mac1.txt").each_line {|l| lines[l.chomp] = true} 
File.open("mac2.txt").each_line {|l| puts l if lines[l.chomp]}