2012-05-22 31 views
1

从预测服务器有两列csv格式的数据,如下所示。第一列是每个预测的每个变量的索引位置。因此,新的数据索引开始1在Ruby中将数据从一列转换为多列

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 

为了便于工作,空的“细胞”可以填充零或#例如

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

让我们尝试使用Array#转来转吧:

# 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