2010-08-12 5 views
1

그래서 나는이처럼 보이는 테이블이 :쉬운 루비 데이터 테이블/검색 질문

A B 
A C 
B A 
C A 
C B 

내가 두 값의 연결이 이미 (너무을 표현의 라인을 삭제할 ---- B는 B ---- A와 동등한 연결입니다. 기본적으로 내 테이블을 이렇게 보이게하고 싶습니다.

A B 
A C 
B C 

어떻게하면 Ruby에서이 작업을 수행 할 수 있습니까?

바비

편집 :

여기에 내 현재 코드 :

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 파일로 올바르게 저장하려면 어떻게해야합니까?

바비

+0

"데이터베이스 테이블"또는 ... 같은 테이블? –

+0

탭으로 구분 된 텍스트 파일이 있습니다. – Bobby

+0

"내 테이블의 일부"라고 말하면 입력 파일이 어떻게 생겼습니까? 원래의 예와 완전히 다릅니다. 이것이 입력 파일이 아닌 경우 실제 입력 파일의 샘플을 제공하십시오. – bta

답변

1

당신이 배열의-배열과 유사한이에 의미 따라서 목록을 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 : 파일에 작성하는 경우 , 우리는하지 않습니다 e IO.write. 배열을 자동으로 문자열로 변환합니다.이 문자열은 문제가 발생한 부분 일 수 있습니다.

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

원래 배열의 쌍 순서가 중요하지 않은 경우이 OK입니다.

그리고

쌍의 요소도 순서는 중요 경우 :

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

경우 : 내가 '테이블'로 믿고있어

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

설정 동등성이 루비에서 정의와 설정은 새 멤버를 확인하는 동등성을 사용한다, 그래서 당신은 신속하고 쉽게이 문제를 해결하기 위해 중첩 된 세트 구조를 사용할 수 있습니다 대신, IO.puts를 사용합니다.

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}