2010-08-12 2 views
1

Так у меня есть таблица, которая выглядит следующим образом:Easy рубин таблицы данных/поиск вопрос

A B 
A C 
B A 
C A 
C B 

Я хочу удалить строки, соединение двух значений уже представлены (так ---- B - эквивалентная связь как B ---- A). В принципе, я хочу, чтобы мой стол выглядел так.

A B 
A C 
B C 

Как это сделать в Ruby?

-Bobby

EDIT:

Вот мой текущий код:

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

+0

Таблица, как в "таблице базы данных" или ...? –

+0

У меня есть текстовый файл, разделенный вкладкой. – Bobby

+0

Когда вы говорите «часть моей таблицы», это то, что выглядит ваш входной файл? Это полностью отличается от вашего первоначального примера. Если это не из вашего входного файла, пожалуйста, укажите образец из вашего фактического входного файла. – bta

ответ

1

Я предполагаю, что на 'столе' вы имеете в виду в массив из-массивов похожее на это:

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

If поэтому, вы можете удалить дубликаты списка с помощью x.collect{|a| a.sort}.uniq.

Update: Чтобы прочитать данные из файла и в массив, использовать что-то вроде:

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

Update 2: Или, вы можете одну линию все это:

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

Update 3: При записи в файл, не нам e IO.write. Он автоматически преобразует массив в строку, которая может быть в вашей задаче. Вместо этого используйте IO.puts:

f.puts x[0].to_s << "\t" << x[1].to_s 
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

Набор эквивалентности определяется в рубин, и наборы использовать равноценности только для проверки новых членов, так что вы можете использовать вложенную структуру набора решить эту проблему быстро и легко.

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} 
Смежные вопросы