2010-08-12 7 views
1

J'ai une table qui ressemble à ceci:nouvelle table de données Ruby/recherche question

A B 
A C 
B A 
C A 
C B 

Je veux supprimer les lignes que la connexion de deux valeurs sont déjà représentées (donc A ---- B est la connexion équivalente à B ---- A). Fondamentalement, je veux que ma table ressemble à ceci.

A B 
A C 
B C 

Comment puis-je faire cela dans Ruby?

-Bobby

EDIT:

Voici mon code actuel:

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 

J'ai essayé ce code, mais je pense que les IO.readlines n'ont pas lu correctement mes colonnes. Voici une partie de ma table.

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

Comment l'obtenir correctement, puis l'enregistrer correctement en tant que fichier TSV?

-Bobby

+0

Tableau comme dans "table de base de données" ou ...? –

+0

J'ai un fichier texte séparé par des tabulations. – Bobby

+0

Quand vous dites "partie de ma table", est-ce que c'est à quoi ressemble votre fichier d'entrée? C'est complètement différent de votre exemple original. Si ce n'est pas de votre fichier d'entrée, veuillez fournir un échantillon de votre fichier d'entrée réel. – bta

Répondre

1

Je suppose par 'table' vous voulez dire un des tableaux-de-gamme semblable à ceci:

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

Si Ainsi, vous pouvez dédoublonner la liste avec x.collect{|a| a.sort}.uniq.

Mise à jour: Pour lire les données sur le fichier et dans le tableau, utilisez quelque chose comme:

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

Mise à jour 2: Ou, vous pouvez d'une ligne la chose:

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

Mise à jour 3: Lors de l'écriture sur le fichier, ne pas nous e IO.write. Il convertit le tableau en une chaîne automatiquement, ce qui pourrait être l'endroit où vous rencontrez votre problème. Au lieu de cela, utilisez IO.puts:

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

Alors, disons que vous avez chargé votre fichier TSV dans un tableau de paires:

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"]] 

Ceci est OK si l'ordre de paires dans le tableau d'origine n'a pas d'importance.

Et si aucun ordre des éléments par paires est important:

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

Set équivalence est définie en rubis et ensembles utiliser équivalence uniquement pour vérifier les nouveaux membres, de sorte que vous pouvez utiliser une structure de jeu imbriqué pour résoudre rapidement et facilement.

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} 
Questions connexes