spu*_*der 5 ruby csv delete-row
给定以下CSV文件,如何删除"foo"列中包含单词"true"的所有行?
Date,foo,bar
2014/10/31,true,derp
2014/10/31,false,derp
Run Code Online (Sandbox Code Playgroud)
我有一个有效的解决方案,但它需要制作一个辅助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
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会从CSV中删除违规行,如下所示:
...
if row[@headersHash['foo']] == 'false'
@csv.delete(true) #Doesn't work
...
Run Code Online (Sandbox Code Playgroud)
看一下ruby文档,看起来这个row类有一个delete_if函数.我对该函数所需的语法感到困惑.有没有办法删除行而不创建新的csv对象?
http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Row.html#method-i-each
Pat*_*ity 14
你应该可以使用CSV::Table#delete_if,但是你需要使用CSV::table而不是CSV::read,因为前者会给你一个CSV :: Table对象,而后者会产生一个数组数组.请注意,此设置还会将标头转换为符号.
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9066 次 |
| 最近记录: |