我有一个与此类似的数据集:http://pastie.org/private/3u1reg72nnjfsgqzgqzwra
该列表是一组需要处理的文件名。如果一个文件名的子字符串为10u,而另一个文件名的子字符串为2u,则其中包含10u的文件名具有来自带有2u子字符串的文件的数据子集。换句话说,当你有这样的东西时:
20021203_V9ut_2u.txt
20021203_V9ut_10u.txt
or
V9cd_2u.txt
V9cd_10u.txt应该从列表中删除20021203_V9ut_10u.txt和V9cd_10u.txt,并且列表中应该只保留带有1u的文件名。
我尝试过几种不同的方法,但它们都太像C或hackish了。我还考虑过拆分字符串,然后使用1u或10u的值构建散列,然后如果存在包含10u值的键,则将其替换为1u,否则丢弃,然后将散列重新映射到用于处理文件内容的数组。
什么是“最好的”或最红宝石的方式,你能提供一个例子吗?
发布于 2011-10-11 14:23:54
如果您的文件列表有时包含的文件不是2u和10u的完美匹配,这将对您有所帮助。如果且仅当存在相应的2u文件时,它才会删除10u文件,否则会将其保留在结果列表中。
files = %w(20021203_V9ut_2u.txt
20021203_V9ut_10u.txt
V9cd_2u.txt
V9cd_10u.txt
test1_2u.txt
thing2_10u.txt)
# Reverse sort them if they aren't already that way
files = files.sort {|a,b| b <=> a }
puts files.inspect
scrubbed_files = []
files.each_with_index { |f,i|
scrubbed_files << f unless f =~ /(.*)_10u\.(.*)/ && files[i-1] =~ /#{$1}_2u\.#{$2}/
}
puts scrubbed_files.inspect发布于 2011-10-11 14:08:21
假设您有一个all_filenames数组作为字符串:
filenames_2u = all_filenames.reject!{ |f| f =~ /10u/ } # edited to be actual working ruby如果您提供的文件是您正在使用的文件,则编辑:
all_filenames = IO.readlines('filenames.txt')发布于 2011-10-12 00:04:16
这种方式更有趣:
a.map {|x| x.split(/_/)}.group_by {|x| x[0...-1]}.map {|_,xx| xx.sort_by {|x| x.last.to_i}.first.join("_")}也就是说,在下划线处将名称拆分成数组,按词干(直到最后一个下划线的部分)对这些数组进行分组,然后对于每个组,按最后一位的整数版本对名称进行排序,并取第一个。
这将适用于任何Xu编号方案,所以如果你有2u、5u和10u,你就会得到2u版本,如果你有10u和20u,你就会得到10u。
group_by很酷。
https://stackoverflow.com/questions/7721946
复制相似问题