1

以下に示すように、予測サーバーからのcsv形式のデータの2つの列があります。最初の列は、各予測の各変数のインデックス位置です。したがって、新しいデータはインデックス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

作業を簡単にするために、空の「セル」はゼロまたは#で埋めることができます。

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でこれを行うためのエレガントな方法を持っている人はいますか?

4

2 に答える 2

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
于 2012-05-22T08:36:26.063 に答える
2

Array#transposeで転置してみましょう:

# 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", "#", "#"], 
["#", "#", "#", "#"]
于 2012-05-22T10:43:44.627 に答える