如何使用Ruby从CSV中删除行

给定以下CSV文件,如何删除“foo”列中包含单词“true”的所有行?

Date,foo,bar 2014/10/31,true,derp 2014/10/31,false,derp 

我有一个有效的解决方案,但它需要制作一个辅助CSV对象csv_no_foo

 @csv = CSV.read(@csvfile, headers: true) #http://bit.ly/1mSlqfA @headers = CSV.open(@csvfile,'r', :headers => true).read.headers # Make a new CSV @csv_no_foo = CSV.new(@headers) @csv.each do |row| # puts row[5] if row[@headersHash['foo']] == 'false' @csv_no_foo.add_row(row) else puts "not pushing row #{row}" end end 

理想情况下,我会从CSV中删除违规行,如下所示:

 ... if row[@headersHash['foo']] == 'false' @csv.delete(true) #Doesn't work ... 

看一下ruby文档,看起来row类有一个delete_if函数。 我对该函数所需的语法感到困惑。 有没有办法删除行而不创建新的csv对象?

http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Row.html#method-i-each

你应该能够使用CSV::Table#delete_if ,但你需要使用CSV::table而不是CSV::read ,因为前者会给你一个CSV :: Table对象,而后者会产生一个Arrayarrays。 请注意,此设置也会将标头转换为符号。

 table = CSV.table(@csvfile) table.delete_if do |row| row[:foo] == 'true' end File.open(@csvfile, 'w') do |f| f.write(table.to_csv) end 

您可能希望以ruby方式过滤行:

 require 'csv' csv = CSV.parse(File.read(@csvfile), { :col_sep => ",", :headers => true } ).collect { |item| item[:foo] != 'true' } 

希望它有所帮助。