0

複数のエントリを含むテキスト ファイルがあります。形式は固定で、name_version_versionNumber.

**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"]  
4

3 に答える 3

1

それらを逆の順序で並べ替えてから、すべての要素をループしてすべての WIP 要素を削除し、各グループの最初の要素を保存する方が簡単ではないでしょうか (^/(.*?)_\d{3}$/ で一致)。 ? そのスキャンはすべてかなり脆いようです。

于 2013-03-13T21:30:54.540 に答える
0

そのような複雑なメソッドを作成する必要があるかどうかは非常に疑わしいです。Ruby には、生活を楽にするためのメソッドがたくさんあります。

したがって、あなたの間違いの 1 つは、メソッドの引数latest_version(x)とマップの反復に同じ名前を使用することlist.map{|x| ... }です。それはあまり良い習慣ではありません

于 2013-03-13T21:38:53.203 に答える