我有一个包含多个条目的文本文件。格式已修复且为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"]
答案 0 :(得分:1)
以相反的顺序对它们进行排序不是更容易,然后遍历所有元素,删除所有WIP元素并保存每个组的第一个(匹配^ /(。*?)_ \ d {3} $ /)?所有扫描都显得非常脆弱。
答案 1 :(得分:0)
非常值得怀疑的是它真的需要创建这样复杂的方法。 Ruby有很多方法可以让生活更轻松。
因此,您的错误之一是对方法参数latest_version(x)
和地图迭代list.map{|x| ... }
使用相同的名称。这不是很好的做法
答案 2 :(得分: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" ]
从文件中读取将data
替换为x = File.readlines("path to txt file")
。
但那只是我。