简单的Ruby数据表/搜索问题

时间:2010-08-12 22:19:22

标签: ruby-on-rails ruby rubygems ruby-on-rails-3

所以我有一个看起来像这样的表:

A    B
A    C
B    A
C    A
C    B

我想删除已经表示两个值的连接的行(因此A ---- B是等效的连接,如B ---- A)。基本上我希望我的桌子看起来像这样。

A    B
A    C
B    C

我如何在Ruby中执行此操作?

-Bobby

修改

这是我目前的代码:

require 'rubygems'


f = File.new("uniquename.txt","w")
i = IO.readlines('bioportnetwork.txt').collect{|l| l.split.sort}.uniq
i.each do |z|
f.write(z + "\n")
end

我尝试了这段代码,但我认为IO.readlines没有正确读取我的列。这是我桌子的一部分。

9722,9754   8755
8755         9722,9754
9722,9754   7970,7971
7970,7971    9722,9754  

如何正确读取,然后正确保存为TSV文件?

-Bobby

3 个答案:

答案 0 :(得分:3)

所以,假设您已将TSV文件加载到一对数组中:

arr = [["A", "B"], ["A", "C"], ["B", "A"], ["C", "A"], ["C", "B"]]
Hash[arr.map{|pair| [pair.sort, pair]}].values
#=> [["B", "A"], ["C", "A"], ["C", "B"]]

如果原始数组中的对的顺序不重要,则可以。

如果成对的元素顺序都不重要:

arr.map(&:sort).uniq
#=> [["A", "B"], ["A", "C"], ["B", "C"]]

答案 1 :(得分:1)

我假设'table'是指与此类似的数组数组:

x = [['A', 'B'],
     ['A', 'C'],
     ['B', 'A'],
     ['C', 'A'],
     ['C', 'B']]

如果是这样,您可以使用x.collect{|a| a.sort}.uniq删除列表。

<强>更新 要从文件和数组中读取数据,请使用以下内容:

lines = IO.readlines('filename.txt')
x = []
lines.each {|l| x << l.split}

更新2: 或者,你可以对整个事情进行整理:

IO.readlines('test.txt').collect{|l| l.split.sort}.uniq

更新3: 写出文件时,请勿使用IO.write。它会自动将数组转换为字符串,这可能是您遇到问题的地方。相反,请使用IO.puts

f.puts x[0].to_s << "\t" << x[1].to_s

答案 2 :(得分:1)

设置等价是在ruby中定义的,并且仅使用等效来检查新成员,因此您可以使用嵌套集结构来快速轻松地解决此问题。

set_of_all_sets = Set.new
file.each_line do |line|
  line =~ /(\S)\s(\S)/
  set_of_all_sets << Set.new([$1, $2])
end
array_of_all_sets.map{|set| set.to_a}