Ruby将csv转换为数组数组
我正在尝试转换此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返回的枚举数转换为一个数组,并将其移位以除去标
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
都是重复的其中映射
就足够了。现在它是枚举器
->数组
数组
但是sinceCSV
包括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
包括可枚举的soCSV.table(“test.CSV”)。drop(1)
足以超过删除(1)
,从而导致Array
->Array