Method: CSV::Table#delete_if

Defined in:
lib/csv/table.rb

#delete_if(&block) ⇒ Object

:call-seq:

table.delete_if {|row_or_column| ... } -> self

Removes rows or columns for which the block returns a truthy value; returns self.

Removes rows when the access mode is :row or :col_or_row; calls the block with each CSV::Row object:

source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
table = CSV.parse(source, headers: true)
table.by_row! # => #<CSV::Table mode:row row_count:4>
table.size # => 3
table.delete_if {|row| row['Name'].start_with?('b') }
table.size # => 1

Removes columns when the access mode is :col; calls the block with each column as a 2-element array containing the header and an Array of column fields:

source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
table = CSV.parse(source, headers: true)
table.by_col! # => #<CSV::Table mode:col row_count:4>
table.headers.size # => 2
table.delete_if {|column_data| column_data[1].include?('2') }
table.headers.size # => 1

Returns a new Enumerator if no block is given:

source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
table = CSV.parse(source, headers: true)
table.delete_if # => #<Enumerator: #<CSV::Table mode:col_or_row row_count:4>:delete_if>


887
888
889
890
891
892
893
894
895
896
897
898
899
# File 'lib/csv/table.rb', line 887

def delete_if(&block)
  return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size } unless block_given?

  if @mode == :row or @mode == :col_or_row  # by index
    @table.delete_if(&block)
  else                                      # by header
    headers.each do |header|
      delete(header) if yield([header, self[header]])
    end
  end

  self # for chaining
end