20

私はそれが行ごとにどのように行われるかを知っています

CSV.foreach(filename.csv) do |row|
  puts "#{row}"
end

しかし、私は列ごとに完全に失われていますか?

4

5 に答える 5

42

test.csv:

name,surname,no1,no2,no3,date
Raja,Palit,77489,24,84,12/12/2011
Mathew,bargur,77559,25,88,01/12/2011
harin,Roy,77787,24,80,12/12/2012
Soumi,paul,77251,24,88,11/11/2012

列によるアクセス:

require 'csv'
csv = CSV.read('test.csv', :headers=>true)
p csv['name'] #=>["Raja", "Mathew", "harin", "Soumi"]

#or even:
t = CSV.table('test.csv')
p t[:no1] #=> [77489, 77559, 77787, 77251]

最後のケースでは、列は記号化された名前でアクセスされ、可能な場合は文字列が数値に変換されることに注意してください。

于 2013-02-08T14:08:24.237 に答える
14

これは解決策です:

CSV.foreach(filename).map { |row| row[0] }

正しい形式での投稿が遅くなり、申し訳ありません。

于 2013-02-08T13:10:37.353 に答える
8

CSV ファイルを転置します。これを行うと、行が列に変換され、その逆になります。転置の簡単な例を以下に示します。

   irb(main):001:0> [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]].transpose
    => [["1", "4", "7"], ["2", "5", "8"], ["3", "6", "9"]]
于 2013-01-30T07:05:35.730 に答える
0

退屈なので、ここで代替ソリューションを作成することにしました。最初の行に最大列数がある場合にのみ機能します(ここ)

columns = {}
rows.first.each_with_index do |col, i|
  columns[i] = []
end
rows.each do |row|
  row.each_with_index do |cell, i|
    columns[i] = columns[i] + [cell]
  end
end

これで、インデックスで各列にアクセスできるはずです

于 2016-02-16T20:39:34.087 に答える