Ruby - 简单文本处理 - 删除具有匹配列的行

时间:2014-05-26 06:52:02

标签: ruby arrays text

快速而简单的一个..我有一个我需要清理的文本文件......

这是输入数组

[["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
 ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
 ["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
 ["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]

所需的输出数组

 [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
  ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"]]

如何使用简单的代码进行操作...删除与列[0..4]匹配的重复行与数组的其余部分。干杯

5 个答案:

答案 0 :(得分:4)

您可以向Array#uniq提供一个块,以指定要查看的属性。因此,为了删除基于前5列的任何重复项,您只能执行以下操作:

input = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
 ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
 ["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
 ["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]

input.uniq { |e| e[0..4] }
# [
#   ["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
#   ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"]
# ]

答案 1 :(得分:3)

这是一种方法:

arr.map { |e| e[0..-2] << "Time1" }.uniq

arr.map { |e| e[0..-2] }.uniq.map { |e| e << "Time1" }

答案 2 :(得分:1)

您可以使用Set类来处理此问题。

这是我的解决方案:

require 'set'

a = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
 ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
 ["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
 ["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]

s = Set.new
a.delete_if { |x| s.size == s.add(x[0..4]).size }

答案 3 :(得分:0)

您可以使用 uniq {| item | ...}→new_ary 。我通过例子解释:

a = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
    ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
    ["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
    ["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]

a.uniq {|s| s[0] && s[1] }
# => [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"], ["10/10/2013", "u2", "m1",   "app1", "IN", "Time_1"]]

有关详细信息,请参阅http://ruby-doc.org/core-1.9.3/Array.html

答案 4 :(得分:-1)

   a = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]
a.uniq {|s| s[0..1] }