[英]How to remove a row from a CSV with Ruby
給定以下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對象,而后者會產生一個Array陣列。 請注意,此設置還會將標頭轉換為符號。
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' }
希望它有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.