2011-08-08 7 views
0

안녕하세요 데이터베이스에서 데이터를 가져 와서 그래프를 만드는 중입니다. 나는 모두 ~ 을 가지고있는 ~ 6000 + 항목들을 되찾고있다. 이 모든 것을 하나의 데이터 구조로 결합하여 중복 키가없는 해시 특성을 활용할 수 있습니다. 데이터를 결합하십시오.루비 중첩 해시 생성

예 :

{'Component' => {'June' => '15.5834'}} #where all of the data gets added 

데이터가 3 개 병렬 배열로 내 프로그램 다시 온다 : I 출력과 같은 ..

'Component', 4.1167, 'June' 
'Component', 3.2167, 'June' 
'Component', 4.8667, 'June' 
'Component', 3.3833, 'June' 

내가처럼 보이는 중첩 된 해시를 만들고 싶어합니다.

이 방법을 통해 모든 데이터를 수집하고 누적하여 해시의 특성에 따라 내 라벨의 중복을 제거 할 수 있습니다.

어떤 방식 으로든 가능합니까?

감사 헌터

답변

2

다시 데이터베이스에서 데이터를 얻고있는 방식에 따라이 비슷한보고 할 것 ...

my_hash = {} 
a1, a2, a3 = get_database_result #whatever you call here 
a1.each_with_index do |component,i| 
    month = a3[i] 
    val = a2[i] 
    month_hash = my_hash[component] #get the month has for the component 
    if month_hash.nil? #if it doesn't exist, create it 
    month_hash = {} 
    my_hash[component] = month_hash 
    end 
    num_val = month_hash[month].nil? ? 0 : month_hash[month] #find the existing numeric value or create a zero 
    num_val += val #increment by database value 
    month_hash[month] = num_val #insert the value 
end 
my_hash #return my_hash 
+0

덕분에 아픈 줄이 나는 경우와 끝까지 어떤 3 개 배열 –

+0

I 달이 나타나지 않는 어떤 이유 때문에'{ 'Component'=> {nil => 'value'}}'일까요 –

+0

을 기반으로하는 코드를 업데이트 탄 –

2

개별 라인 항목의 경우 ActiveRecord 인스턴스 인 것처럼 열 이름을 가진 해시 유사 객체가 있습니다. 다음 코드는 원하는 최종 해시로 병합합니다. 이것은 독립 실행 형 예입니다.

@result = {} 
def f x 
    @result.merge!({ x[:c] => { x[:m] => x[:v] }}) do |k, o, n| 
    o.merge!(n) do |k, o, n| 
     o + n 
    end 
    end 
end 

f :c => 'Component', :v => 4.1167, :m => 'June' 
f :c => 'Component', :v => 3.2167, :m => 'June' 
f :c => 'Component', :v => 4.8667, :m => 'June' 
f :c => 'Component', :v => 3.3833, :m => 'June' 

p @result 

업데이트 : 아하, 병렬 배열? 글쎄, 당신은 변경 될 수 있습니다에 병합 호출 : 데이터가 다시 세 개의 병렬 배열로 제공

f :c => components[i], :v => values[i], :m => months[i] 
+0

아이디어를 주셔서 감사합니다, 내 수업 ActiveRecord에서 상속하지 마십시오. 나는 XML 파일을 생성하기 위해 mysql 커맨드 라인을 사용하고있다. 그래서 저는 루비 db를 호출하는 대신에 파싱을합니다. –

+0

정말 중요하지 않지만 보입니다. f (x)는 임의의 구성 요소 이름으로 데이터의 한 줄을 나타내는 해시를 취해 개요에 따라 병합합니다. – DigitalRoss