2013-03-13 41 views
0

我有一個包含多個條目的文本文件。格式是固定的,並且是name_version_versionNumber來自txt的最新文件數組讀取所有文件

**example.txt** 
cool_name_A_001 
something_else_WIP_002 
something_else_001 
cool_name_B_002 
other_thing_010 
other_thing_006 

返回列表應消除WIP的條目,並提供最新的(最多)版本。輸出爲文本文件,上面應該是

cool_name_A_001 
cool_name_B_002 
other_thing_010 
something_else_001 

到目前爲止,我有

#import files 
x = File.readlines("path to txt file").delete_if {|x| x.scan(/[WIP]../).include? "WIP"}.sort 

#include latest copy only 
#include latest copy only 
def latest_version(x) 
list = [] 
i = 0 
while i<x.length 
    if list.map {|x| x.scan(/\D+/)}.flatten.include? x[i].scan(/\D+/) 
     zet = list.map {|x| x.scan(/\D+/)}.flatten.rindex x[i].scan(/\D+/) 
     if list[zet].scan(/\d+/) > x[i].scan(/\d+/) 
      i+=1 
     else 
      list[zet] = x[i] 
      i+=1 
     end 
    elsif x[i].scan(/\D+/) == x[i+1].scan(/\D+/) 
     if x[i].scan(/\d+/) > x[i+1].scan(/\d+/) 
      list << x[i] 
      i+=1 
     else 
      list << x[i+1] 
      i+=1 
     end 
    else 
     list << x[i] 
     i+=1 
    end 
    end 
    list 
end 

puts latest_version(x) 

我收到以下錯誤

rb:10:in `latest_version': private method `scan' called for 114:Fixnum (NoMethodError) 

錯誤方法適用於IRB和想不通爲什麼錯誤?此外,不能分辨邏輯是否達到了期望的結果。請幫忙!謝謝:)

1.9.3p374 :098 > y 
=> ["something_SA_R33\n", "whatever_SA_R012\n", "anything_SB_R012\n"] 
1.9.3p374 :099 > y.map {|x| x.scan(/\d+/)}.flatten 
=> ["33", "012", "012"] 

回答

0

我會使用類似:

 
data = %w[ 
    cool_name_A_001 
    something_else_WIP_002 
    something_else_001 
    cool_name_B_002 
    other_thing_010 
    other_thing_006 
] 

data.reject{ |s| s['_WIP_'] }.group_by{ |s| s[/\A(.+)_\d+/, 1] }.map{ |k, v| v.max }.sort 
[ 
    [0] "cool_name_A_001", 
    [1] "cool_name_B_002", 
    [2] "other_thing_010", 
    [3] "something_else_001" 
] 

若要從文件中讀取x = File.readlines("path to txt file")取代data

但這就是我。

+0

這絕對是我的目標,使代碼看起來很好!謝謝! – aug2uag 2013-03-13 22:04:06

+1

謝謝。我用很多語言編程,但Ruby是我最喜歡的。它具有表現力,它使我們在保持可讀性的同時簡潔。 「禪宗」一詞常常適用於我所見過的代碼,在我看到它的時候,我必須驚訝於它。簡單,有力,就是我們所追求的。偶爾我偶然發現它。 :-) – 2013-03-13 22:07:35

+0

這對學習很有用,表明我需要更熟悉Enumerables(注意Array方法)以及我需要練習Regex和/或使用Rubular。無論誰打破了你的答案,他們不再能從他們的硬化症中找到靜脈之後,就會患有結節病並且死於營養不良。 – aug2uag 2013-03-13 22:14:51

1

那豈不是更容易將它們以相反的順序,然後通過所有刪除所有WIP元素,節省了第一每組的元素環(在比賽進行排序^ /(。* ?)_ \ d {3} $ /)?所有的掃描看起來都很脆弱。

+0

是的,我認爲它是上面的方式真的很慢,沒有必要。我會研究你的建議,謝謝! – aug2uag 2013-03-13 21:32:30

0

這是非常可疑的是它真的需要創建這樣複雜的方法。 Ruby有很多方法來創造更簡單的生活。

因此,您的一個錯誤是爲方法參數latest_version(x)和地圖迭代list.map{|x| ... }使用相同的名稱。這不是很好的做法

+0

很好的通話,那些x應該是不同的 – aug2uag 2013-03-13 21:49:31