Spec-Zone.ru › Ruby 2.7

класс CSV::Table

Родитель:
Объект
Включенные модули:
Enumerable

A CSV::Table — это двумерная структура данных для представления CSV документов. Таблицы позволяют работать с данными по строкам или столбцам, обрабатывать данные и даже преобразовывать результаты обратно в CSV, если необходимо.

Все таблицы, возвращаемые CSV, будут созданы из этого класса, если обработка заголовков включена.

Атрибуты

mode[R]

Текущий режим доступа для индексирования и итерации.

table[R]

Внутренний формат данных, используемый для сравнения на равенство.

Открытые методы класса

new(array_of_rows, headers: nil) Показать исходный код
# File lib/csv/table.rb, line 31
def initialize(array_of_rows, headers: nil)
  @table = array_of_rows
  @headers = headers
  unless @headers
    if @table.empty?
      @headers = []
    else
      @headers = @table.first.headers
    end
  end

  @mode  = :col_or_row
end

Создает новую CSV::Table из array_of_rows, которые должны быть объектами CSV::Row. Предполагается, что все строки имеют одинаковые заголовки.

Необязательный параметр headers может быть установлен в Array заголовков. Если заголовки не заданы, заголовки извлекаются из объектов CSV::Row. В противном случае метод headers() вернет заголовки, заданные в аргументе headers.

Объект CSV::Table поддерживает следующие методы Array через делегирование:

  • empty?()

  • length()

  • size()

Общедоступные методы экземпляров

<<(row_or_array) Показать исходный код
# File lib/csv/table.rb, line 243
def <<(row_or_array)
  if row_or_array.is_a? Array  # append Array
    @table << Row.new(headers, row_or_array)
  else                         # append Row
    @table << row_or_array
  end

  self # for chaining
end

Добавляет новую строку в конец этой таблицы. Вы можете указать Array, который будет преобразован в CSV::Row (унаследующий заголовки таблицы), или CSV::Row.

Этот метод возвращает таблицу для цепочки вызовов.

==(other) Показать исходный код
# File lib/csv/table.rb, line 344
def ==(other)
  return @table == other.table if other.is_a? CSV::Table
  @table == other
end

Возвращает true , если все строки этой таблицы ==() other строки.

[](index_or_header) Показать исходный код
# File lib/csv/table.rb, line 155
def [](index_or_header)
  if @mode == :row or  # by index
     (@mode == :col_or_row and (index_or_header.is_a?(Integer) or index_or_header.is_a?(Range)))
    @table[index_or_header]
  else                 # by header
    @table.map { |row| row[index_or_header] }
  end
end

В стандартном смешанном режиме этот метод возвращает строки для доступа по индексу и столбцы для доступа по заголовкам. Вы можете принудительно связать индексы, вызвав сначала by_col!() или by_row!().

Столбцы возвращаются в виде Array значений. Изменение этого Array не влияет на таблицу.

[]=(index_or_header, value) Показать исходный код
# File lib/csv/table.rb, line 180
def []=(index_or_header, value)
  if @mode == :row or  # by index
     (@mode == :col_or_row and index_or_header.is_a? Integer)
    if value.is_a? Array
      @table[index_or_header] = Row.new(headers, value)
    else
      @table[index_or_header] = value
    end
  else                 # set column
    unless index_or_header.is_a? Integer
      index = @headers.index(index_or_header) || @headers.size
      @headers[index] = index_or_header
    end
    if value.is_a? Array  # multiple values
      @table.each_with_index do |row, i|
        if row.header_row?
          row[index_or_header] = index_or_header
        else
          row[index_or_header] = value[i]
        end
      end
    else                  # repeated value
      @table.each do |row|
        if row.header_row?
          row[index_or_header] = index_or_header
        else
          row[index_or_header] = value
        end
      end
    end
  end
end

В стандартном смешанном режиме этот метод присваивает строки для доступа по индексу и столбцы для доступа по заголовкам. Вы можете принудительно связать индексы, вызвав сначала by_col!() или by_row!().

Строки можно установить в Array значений (которые унаследуют заголовки таблицы) или CSV::Row.

Столбцы можно установить в одно значение, которое копируется в каждую строку столбца, или Array значений. Массивы значений присваиваются строкам сверху вниз в порядке следования строк. Избыточные значения игнорируются, и если в Array нет значения для каждой строки, дополнительные строки получат значение nil.

Присвоение существующему столбцу или строке перезаписывает данные. Присвоение новым столбцам создает их в правой части таблицы.

by_col() Показать исходный код
# File lib/csv/table.rb, line 66
def by_col
  self.class.new(@table.dup).by_col!
end

Возвращает дубликат объекта таблицы в режиме столбцов. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.

Этот метод возвращает дубликат таблицы для цепочки вызовов. Не используйте цепочку деструктивных методов (например, []=()) таким образом, так как вы работаете с дубликатом.

by_col!() Показать исходный код
# File lib/csv/table.rb, line 76
def by_col!
  @mode = :col

  self
end

Переключает режим этой таблицы на столбцовый режим. Все вызовы методов индексирования и итерации будут работать со столбцами, пока режим не будет изменён снова.

Этот метод возвращает таблицу и может быть использован в цепочке вызовов.

by_col_or_row() Показать исходный код
# File lib/csv/table.rb, line 91
def by_col_or_row
  self.class.new(@table.dup).by_col_or_row!
end

Возвращает дубликат объекта таблицы в смешанном режиме. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.

Этот метод возвращает дубликат таблицы для цепочки вызовов. Не используйте цепочку деструктивных методов (например, []=()) таким образом, так как вы работаете с дубликатом.

by_col_or_row!() Показать исходный код
# File lib/csv/table.rb, line 103
def by_col_or_row!
  @mode = :col_or_row

  self
end

Переключает режим этой таблицы на смешанный режим. Все вызовы методов индексирования и итерации будут использовать стандартную систему интеллектуального индексирования, пока режим не будет изменён снова. В смешанном режиме индекс предполагается как ссылка на строку, а все остальное — как доступ к столбцу по заголовкам.

Этот метод возвращает таблицу и может быть использован в цепочке вызовов.

by_row() Показать исходный код
# File lib/csv/table.rb, line 118
def by_row
  self.class.new(@table.dup).by_row!
end

Возвращает дубликат объекта таблицы в режиме строк. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.

Этот метод возвращает дубликат таблицы для цепочки вызовов. Не используйте цепочку деструктивных методов (например, []=()) таким образом, так как вы работаете с дубликатом.

by_row!() Показать исходный код
# File lib/csv/table.rb, line 128
def by_row!
  @mode = :row

  self
end

Переключает режим этой таблицы на режим строк. Все вызовы методов индексирования и итерации будут работать со строками, пока режим не будет изменён снова.

Этот метод возвращает таблицу и может быть использован в цепочке вызовов.

delete(*indexes_or_headers) Показать исходный код
# File lib/csv/table.rb, line 271
def delete(*indexes_or_headers)
  if indexes_or_headers.empty?
    raise ArgumentError, "wrong number of arguments (given 0, expected 1+)"
  end
  deleted_values = indexes_or_headers.map do |index_or_header|
    if @mode == :row or  # by index
        (@mode == :col_or_row and index_or_header.is_a? Integer)
      @table.delete_at(index_or_header)
    else                 # by header
      if index_or_header.is_a? Integer
        @headers.delete_at(index_or_header)
      else
        @headers.delete(index_or_header)
      end
      @table.map { |row| row.delete(index_or_header).last }
    end
  end
  if indexes_or_headers.size == 1
    deleted_values[0]
  else
    deleted_values
  end
end

Удаляет и возвращает указанные столбцы или строки. В стандартном смешанном режиме индексы относятся к строкам, а всё остальное — к заголовкам столбцов. Используйте by_col!() или by_row!() для принудительного поиска.

delete_if() { |header, self| ... } Показать исходный код
# File lib/csv/table.rb, line 305
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
    deleted = []
    headers.each do |header|
      deleted << delete(header) if yield([header, self[header]])
    end
  end

  self # for chaining
end

Удаляет любой столбец или строку, для которой блок возвращает true. В стандартном смешанном или строковом режиме итерация — это стандартное поочередное прохождение строк. В столбцовом режиме итерация будет yield кортежи из двух элементов, содержащие имя столбца и Array значений для этого столбца.

Этот метод возвращает таблицу для цепочки вызовов.

Если блок не задан, возвращается Enumerator.

dig(index_or_header, *index_or_headers) Показать исходный код
# File lib/csv/table.rb, line 383
def dig(index_or_header, *index_or_headers)
  value = self[index_or_header]
  if value.nil?
    nil
  elsif index_or_headers.empty?
    value
  else
    unless value.respond_to?(:dig)
      raise TypeError, "#{value.class} does not have \#dig method"
    end
    value.dig(*index_or_headers)
  end
end

Извлекает вложенное значение, указанное последовательностью index или header объектов, вызывая dig на каждом шаге, возвращая nil, если какой-либо промежуточный шаг равен nil.

each() { |header, self| ... } Показать исходный код
# File lib/csv/table.rb, line 331
def each(&block)
  return enum_for(__method__) { @mode == :col ? headers.size : size } unless block_given?

  if @mode == :col
    headers.each { |header| yield([header, self[header]]) }
  else
    @table.each(&block)
  end

  self # for chaining
end

В стандартном смешанном или строковом режиме итерация — это стандартное поочередное прохождение строк. В столбцовом режиме итерация будет yield кортежи из двух элементов, содержащие имя столбца и Array значений для этого столбца.

Этот метод возвращает таблицу для цепочки вызовов.

Если блок не задан, возвращается Enumerator.

headers() Показать исходный код
# File lib/csv/table.rb, line 139
def headers
  if @table.empty?
    @headers.dup
  else
    @table.first.headers
  end
end

Возвращает заголовки для первой строки этой таблицы (предполагается, что они совпадают со всеми другими строками). Array заголовков, переданных в CSV::Table.new, возвращаются для пустых таблиц.

inspect() Показать исходный код
# File lib/csv/table.rb, line 398
def inspect
  "#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>".encode("US-ASCII")
end

Отображает режим и размер этой таблицы в String ASCII.

END_OF_DOCUMENT_MARKER
push(*rows) Показать исходный код
# File lib/csv/table.rb, line 260
def push(*rows)
  rows.each { |row| self << row }

  self # for chaining
end

Сокращение для добавления нескольких строк. Эквивалентно:

rows.each { |row| self << row }

Этот метод возвращает таблицу для цепочки вызовов.

to_a() Показать исходный код
# File lib/csv/table.rb, line 353
def to_a
  array = [headers]
  @table.each do |row|
    array.push(row.fields) unless row.header_row?
  end

  array
end

Возвращает таблицу в виде Array массивов. Заголовки будут первой строкой, а затем последуют все строки с данными.

to_csv(write_headers: true, **options) Показать исходный код
# File lib/csv/table.rb, line 369
def to_csv(write_headers: true, **options)
  array = write_headers ? [headers.to_csv(**options)] : []
  @table.each do |row|
    array.push(row.fields.to_csv(**options)) unless row.header_row?
  end

  array.join("")
end

Возвращает таблицу в виде полного CSV String. Заголовки будут указаны вначале, затем все строки с данными.

Этот метод предполагает, что вам нужны Table.headers(), если вы явно не передадите :write_headers => false.

Также алиас: to_s
to_s(write_headers: true, **options)
Псевдоним для: to_csv
values_at(*indices_or_headers) Показать исходный код
# File lib/csv/table.rb, line 222
def values_at(*indices_or_headers)
  if @mode == :row or  # by indices
     ( @mode == :col_or_row and indices_or_headers.all? do |index|
                                  index.is_a?(Integer)         or
                                  ( index.is_a?(Range)         and
                                    index.first.is_a?(Integer) and
                                    index.last.is_a?(Integer) )
                                end )
    @table.values_at(*indices_or_headers)
  else                 # by headers
    @table.map { |row| row.values_at(*indices_or_headers) }
  end
end

По умолчанию смешанный режим интерпретирует список индексов как доступ к строкам, возвращая указанные строки. Все остальное считается доступом к столбцам. При доступе к столбцам возвращаемый набор содержит Array для каждой строки со значениями, указанными заголовками в каждом Array. Вы можете принудительно использовать режим столбцов или строк с помощью by_col!() или by_row!().

Смешивание доступа к столбцам и строкам невозможно.

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API