我有一个如下所示的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
我需要改变什么?或者有更好的方法来解决这个问题吗?
答案 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电子邮件地址周围的空格。