Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从txt读取所有文件的最新文件数组_Ruby_Regex_Arrays - Fatal编程技术网

Ruby 从txt读取所有文件的最新文件数组

Ruby 从txt读取所有文件的最新文件数组,ruby,regex,arrays,Ruby,Regex,Arrays,我有一个包含多个条目的文本文件。格式是固定的,是name\u version\u 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 o

我有一个包含多个条目的文本文件。格式是固定的,是
name\u version\u 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)
error方法在irb中工作,并且无法找出错误的原因?此外,无法判断逻辑是否达到预期结果。请帮忙!谢谢:)


将它们按相反顺序排序,然后遍历所有元素删除所有WIP元素并保存每个组的第一个元素(匹配于^/(.*)\d{3}$/)不是更容易吗?所有这些扫描看起来都很脆弱。

很有疑问的是,它真的需要创建这样复杂的方法。Ruby有很多方法可以让生活变得更轻松


因此,您的一个错误是对方法参数
最新版本(x)
和映射迭代
list.map{x}
使用相同的名称。这不是一个很好的实践

我会使用以下方法:

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" ] 数据=%w[ 酷_name_A_001 其他东西在制品002 还有别的吗 酷_名称_B_002 其他事情 其他事情 ] 数据。拒绝{s|s[''u WIP']}。按{s|s[/\A(+)\ud+/,1]}对{u进行分组。映射{k,v | v.max}。排序 [ [0]“酷炫的名字\u A\u 001”, [1] “酷炫的名字”, [2] “其他事情”, [3] “还有别的事吗?” ] 要读取文件,请将
数据
替换为
x=file.readlines(“txt文件路径”)


但那只是我。

是的,我认为上面的方式真的很慢而且没有必要。我会考虑你的建议,谢谢!让代码看起来这么好绝对是我的目标!非常感谢。非常感谢。我用很多语言编写过程序,但Ruby是我最喜欢的。它富有表现力,让我们在保持可读性的同时保持简洁。“禅宗式”这一术语经常适用于我所见过的代码,当我看着它时,我会惊讶地坐在那里。简单,强大,是我们所追求的。偶尔我也会碰到它。:-)这对学习很有帮助,说明我需要更熟悉可枚举性(专注于数组方法)以及我需要练习正则表达式和/或使用Rubular。无论是谁否决了你的答案,都可能在硬化症中找不到静脉后,患上结节病,死于营养不良。否决票不是问题。如果一个答案是好的,即使它没有被选中,随着时间的推移,它仍然会得到更多的选票。Enumerable很酷。了解如何在您自己的类中实现可比较和可枚举,您将获得大量有用的方法。
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"]  
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" ]