2012-05-22 4 views
1

예측 서버의 아래에 표시된 것처럼 두 열의 데이터가 CSV 형식으로 있습니다. 첫 번째 열은 각 예측에 대한 각 변수의 인덱스 위치입니다. 따라서 새로운 데이터가 인덱스에서 시작 1.루비의 한 열에서 여러 열로 데이터 변환

1,2.0 
2,1.5 
3,1.4 
1,1.1 
2,2.0 
3,1.5 
4,2.0 
5,1.6 
1,2.0 
2,4.0 

. 
. 
. 
내가 대신이 형식의 데이터를하고 싶은

,

작업의 편의를 위해
2.0,1.1,2.0 
1.5,2.0,4.0 
1.4,1.5 
    2.0 
    1.6 

, 빈 '세포'0으로 채워 할 수 있습니다 또는 # 예 :

2.0,1.1,2.0 
1.5,2.0,4.0 
1.4,1.5,0 
0, 2.0,0 
0, 1.6,0 

Ruby에서 우아한 방법이 있습니까?

+1

지난 5.0 3 열에서 그것은이었다 – pguardiario

+0

감사를가는 이유는 분명하지 않다 오식! – eastafri

답변

2

가의 배열 번호의 트랜스와 트랜스 해보자 :

# first get a 2d representation of the data 
rows = CSV.read(fn).slice_before{|row| "1" == row[0]}.map{|x| x.map{|y| y[1]}} 

# we want to transpose the array but first we have to fill empty cells 
max_length = rows.max_by{|x| x.length}.length 
rows.each{|row| row.fill '#', row.length..max_length} 

# now we can transpose the array 
pp rows.transpose 

["2.0", "1.1", "2.0", "5.0"], 
["1.5", "2.0", "4.0", "#"], 
["1.4", "1.5", "#", "#"], 
["#", "2.0", "#", "#"], 
["#", "1.6", "#", "#"], 
["#", "#", "#", "#"] 
2

이 당신을 위해 작동합니다 :

require 'csv' 

# read csv contents from file to array 
rows = CSV.read("path/to/in_file.csv") 

res = Hash.new {|h,k| h[k] = []} 
rows.each do |(key, val)| 
    res[key] << val 
end 

# write to output csv file 
CSV.open("path/to/out_file.csv", "wb") do |csv| 
    # sort res hash by keys, map to have array of values and add to csv 
    res.sort_by{|k, v| k}.map{|k, v| v}.each do |r| 
    csv << r 
    end 
end 
+0

많은 분들께 감사드립니다! 불행히도이 데이터 세트에서는 작동하지 않습니다 ... 어떤 아이디어입니까? http://pastebin.com/2CcEJf6t – eastafri

+0

왜 이것이 작동하지 않습니까? 그것은 당신이 묘사 한 형식으로 csv에 모든 데이터를 수집했습니다. 물론 출력 CSV의 예보다 많은 열이 있습니다. – Hck

+0

출력 데이터가 초기 데이터와 일치하지 않습니다. 여기에 붙여 넣기를 참조하십시오 : http://pastebin.com/CUiVHaFd – eastafri

관련 문제