如何使用CSV制作阵列数组?

时间:2013-06-19 23:58:39

标签: ruby

我有一个如下所示的CSV文件:

Jenny, jenny@example.com ,
Ricky, ricky@example.com ,
Josefina josefina@example.com ,

我正在尝试获得此输出:

users_array = [
['Jenny', 'jenny@example.com'], ['Ricky', 'ricky@example.com'], ['Josefina', 'josefina@example.com']
]

我试过这个:

users_array = Array.new

file = File.new('csv_file.csv', 'r') 
file.each_line("\n") do |row| 
    puts row + "\n" 
    columns = row.split(",") 
    users_array.push columns 
    puts users_array
end 

不幸的是,在终端中,这会返回:

Jenny
jenny@example.com
Ricky
ricky@example.com
Josefina
josefina@example.com

我认为这不适用于此:

users_array.each_with_index do |user|
    add_page.form_with(:id => 'new_user') do |f|
      f.field_with(:id => "user_email").value = user[0]
      f.field_with(:id => "user_name").value = user[1]
    end.click_button
end

我需要改变什么?或者有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

Ruby的标准库有一个CSV类,其类似于File的api,但包含许多用于处理表格数据的有用方法。要获得所需的输出,您需要做的就是:

require 'csv'
users_array = CSV.read('csv_file.csv')

PS - 我认为你也可以通过文件解析得到你期望的输出,但也许你会被它打印到终端的方式所抛弃。 puts与数组的行为不同,在新行上打印每个成员对象而不是单个数组。如果要将其视为数组,请使用puts my_array.inspect

答案 1 :(得分:0)

假设您的CSV文件在第三行的名称和电子邮件地址之间实际上有逗号:

require 'csv'

users_array = []
CSV.foreach('csv_file.csv') do |row|
  users_array.push row.delete_if(&:nil?).map(&:strip)
end

users_array
# => [["Jenny", "jenny@example.com"],
#     ["Ricky", "ricky@example.com"],
#     ["Josefina", "josefina@example.com"]]

可能有一种更简单的方法,但我在那里做的是丢弃尾随逗号创建的nil字段,并strip ping电子邮件地址周围的空格。