簡體   English   中英

如何使用Ruby從CSV中刪除行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM