在Ruby中过滤到带有标题的新CSV?

在Ruby中过滤到带有标题的新CSV?,ruby,csv,header,Ruby,Csv,Header,我有一个CSV,包含基本的人员列表、性别和年龄,以及相应的标题: "First Name","Age","Gender" "Adam",31,"Male" "Bruce",36,"Male" "Lawrence",34,"Male" "James",32,"Male" "Elyse",30,"Female" "Matt",32,"Male" 我想用Ruby打开这个CSV,逐行检查,将所有男性成员附加到一个具有相同标题的新CSV,并将这个CSV保存到一个新文件中 我现在的代码(不起作用) 我收到

我有一个CSV,包含基本的人员列表、性别和年龄,以及相应的标题:

"First Name","Age","Gender"
"Adam",31,"Male"
"Bruce",36,"Male"
"Lawrence",34,"Male"
"James",32,"Male"
"Elyse",30,"Female"
"Matt",32,"Male"
我想用Ruby打开这个CSV,逐行检查,将所有男性成员附加到一个具有相同标题的新CSV,并将这个CSV保存到一个新文件中

我现在的代码(不起作用)

我收到的错误消息:

/usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/csv.rb:1692:in `<<': undefined method `<<' for {:headers=>["First Name", "Age", "Gender"]}:Hash (NoMethodError)
Did you mean?  <
    from csv.rb:8:in `block in <main>'
    from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/csv.rb:1748:in `each'
    from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/csv.rb:1131:in `block in foreach'
    from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/csv.rb:1282:in `open'
    from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/csv.rb:1130:in `foreach'
    from csv.rb:6:in `<main>'
/usr/local/ceral/ruby/2.3.0/lib/ruby/2.3.0/csv.rb:1692:in`
csv#new
将“字符串或IO对象”作为第一个参数,将可选哈希作为第二个参数

因此,看起来错误实际上是由以下行引起的:

new_cast = CSV.new(:headers => CSV.read(file, :headers => :true).headers)
应该是哪一个

new_cast = CSV.new("", :headers => CSV.read(file, :headers => :true).headers)
请注意空字符串

但即使这样,也无法编写新的CSV。为此,我认为您需要在新的CSV中
写入_头文件
,然后
在写入前倒带
,公开底层文件

需要“csv”
文件='cast.csv'
new_cast=CSV.new(“,:headers=>CSV.read(文件,:headers=>:true)。headers,write_headers:true)
CSV.foreach(文件,:headers=>:true,:header\u converters=>:symbol)do |行|
如果行[:性别]=“男性”
新建\u类型转换。添加\u行(行)
结束
结束
CSV.open('new_cast.CSV','w')do | CSV|
新的播放回放
new|u cast.each{row | csv
csv#new
将“string或IO object”作为其第一个参数,并将可选哈希作为其第二个参数

因此,看起来错误实际上是由以下行引起的:

new_cast = CSV.new(:headers => CSV.read(file, :headers => :true).headers)
应该是哪一个

new_cast = CSV.new("", :headers => CSV.read(file, :headers => :true).headers)
请注意空字符串

但即使这样,这也不会写入新的CSV。为此,我认为您需要
在新的CSV中写入标题
,然后
在写入之前将其倒带,露出底层

需要“csv”
文件='cast.csv'
new_cast=CSV.new(“,:headers=>CSV.read(文件,:headers=>:true)。headers,write_headers:true)
CSV.foreach(文件,:headers=>:true,:header\u converters=>:symbol)do |行|
如果行[:性别]=“男性”
新建\u类型转换。添加\u行(行)
结束
结束
CSV.open('new_cast.CSV','w')do | CSV|
新的播放回放
新的_cast.each{| row | csv