Ruby将csv转换为数组数组

Ruby将csv转换为数组数组,ruby,Ruby,我正在尝试转换此csv文件: cash,units,boxes,type 12,1,4,"beer" 12,5,4,"wine" 6,3,2,"sugar" 6,5,2,"oats" 到仅包含行和而不是标题的数组。如何做到这一点 我有这个: csv = CSV.read(input_path, headers: with_headers) 这给了我一个有5行的csv对象。如何将内容转换为一个包含4个数组的数组,其中每个子数组表示一行?只需将CSV返回的枚举数转换为一个数组,并将其移位以除去标

我正在尝试转换此csv文件:

cash,units,boxes,type
12,1,4,"beer"
12,5,4,"wine"
6,3,2,"sugar"
6,5,2,"oats"
到仅包含行和而不是标题的数组。如何做到这一点

我有这个:

csv = CSV.read(input_path, headers: with_headers)

这给了我一个有5行的csv对象。如何将内容转换为一个包含4个数组的数组,其中每个子数组表示一行?

只需将CSV返回的枚举数转换为一个数组,并将其移位以除去标题即可

rows = CSV.open(input_path).each.to_a
rows.shift
rows
=> [["12", "1", "4", "beer"], ["12", "5", "4", "wine"], ["6", "3", "2", "sugar"], ["6", "5", "2", "oats"]]
如果您更喜欢更优雅的解决方案,并且确实希望这样对待标题:

CSV.open(input_path, headers: true, return_headers: false).map(&:fields)

请注意,在这种情况下,
。每个
都会产生
CSV::Row
对象,而不是数组。

我对此不确定,但我会用这种方式解决它

CSV.read(path, {:row_sep => :auto, :col_sep => ','}).drop(1)
在您的情况下,我相信您必须在属性
:col_sep

require "csv"

 p csv = CSV.table("test.csv").drop(1)

输出以
[[12,1,4,“beer”],
开始。也就是说:尽可能使用数字,而不是到处都是字符串。

不过我不想使用标题。更正了,标题消失了。您需要更新返回值,因为它仍然将标题显示为返回的数组的第一个元素。我建议
删除(1)
而不是
shift
,因为它避免了行
行的需要
@CarySwoveland感谢您指出返回值,已更正。
每个.to_a.map
都是
重复的
其中
映射
就足够了。现在它是
枚举器
->
数组
数组
但是since
CSV
包括
Enumerable
map(&:fields)
将返回
数组
:col_sep
默认值为
,“
这是合理的,因为“CSV”传统上是“逗号分隔值”的首字母缩写如果你不确定某件事,作为评论比作为答案更合适。我相信@steenslag的答案给出的结果是正确的,而你选择的答案则不正确(例如,
[12,1,4,“beer”]
,而不是
[“12”,“1”,“4”,“beer”]
)。否?读者:请参阅文档,了解其与相同之处,除了(如图所示),其中三个
选项
键被指定为默认值,一个是
转换器::数值
,它转换
“1”#=>1
“1.4”=>1.4
“cat”=>。.cat“
等等。各种选项都记录在
CSV::new
中。旁注
CSV
包括
可枚举的
so
CSV.table(“test.CSV”)。drop(1)
足以超过
删除(1)
,从而导致
Array
->
Array