Spec-Zone.ru › Ruby 2.5

класс CSV::Row

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

Объект CSV::Row — это комбинация массива и хэша. Он сохраняет порядок полей и допускает дубликаты, как массив, но также позволяет получать доступ к полям по имени, как если бы они были в хэше.

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

Атрибуты

row[R]

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

Публичные методы класса

new(headers, fields, header_row = false) Показать исходный код
# File lib/csv.rb, line 235
def initialize(headers, fields, header_row = false)
  @header_row = header_row
  headers.each { |h| h.freeze if h.is_a? String }

  # handle extra headers or fields
  @row = if headers.size >= fields.size
    headers.zip(fields)
  else
    fields.zip(headers).each(&:reverse!)
  end
end

Создаёт новый объект CSV::Row из headers и fields, которые должны быть массивами. Если один массив короче другого, он будет дополнен nil объектами.

Необязательный параметр header_row может быть установлен в true для указания, что это строка заголовков, с помощью #header_row? и #field_row?. В противном случае строка предполагается как строка данных.

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

  • empty?()

  • length()

  • size()

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

<<( field ) Показать исходный код
<<( header_and_field_array )
<<( header_and_field_hash )
# File lib/csv.rb, line 380
def <<(arg)
  if arg.is_a?(Array) and arg.size == 2  # appending a header and name
    @row << arg
  elsif arg.is_a?(Hash)                  # append header and name pairs
    arg.each { |pair| @row << pair }
  else                                   # append field value
    @row << [nil, arg]
  end

  self  # for chaining
end

Если предоставлен массив из двух элементов, предполагается, что это заголовок и поле, и пара добавляется. Хэш работает аналогичным образом, где ключ — заголовок, а значение — поле. В противном случае предполагается, что это одиночное поле, которое добавляется со стандартным заголовком nil.

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

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

Возвращает true, если эта строка содержит те же заголовки и поля в том же порядке, что и other.

[](header_or_index, minimum_index = 0)
Псевдоним для: field
[]=( header, value ) Показать исходный код
[]=( header, offset, value )
[]=( index, value )
# File lib/csv.rb, line 347
def []=(*args)
  value = args.pop

  if args.first.is_a? Integer
    if @row[args.first].nil?  # extending past the end with index
      @row[args.first] = [nil, value]
      @row.map! { |pair| pair.nil? ? [nil, nil] : pair }
    else                      # normal index assignment
      @row[args.first][1] = value
    end
  else
    index = index(*args)
    if index.nil?             # appending a field
      self << [args.first, value]
    else                      # normal header assignment
      @row[index][1] = value
    end
  end
end

Ищет поле по семантике, описанной в #field, и присваивает ему value.

Присвоение за пределами строки с помощью индекса установит все пары между значениями [nil, nil]. Присвоение несуществующему заголовку добавляет новую пару.

delete( header ) Показать исходный код
delete( header, offset )
delete( index )
# File lib/csv.rb, line 415
def delete(header_or_index, minimum_index = 0)
  if header_or_index.is_a? Integer                 # by index
    @row.delete_at(header_or_index)
  elsif i = index(header_or_index, minimum_index)  # by header
    @row.delete_at(i)
  else
    [ ]
  end
end

Используется для удаления пары из строки по header или index. Пара находится по описанию в #field. Удаленная пара возвращается, или nil в случае, если пара не найдена.

delete_if(&block) Показать исходный код
# File lib/csv.rb, line 434
def delete_if(&block)
  block or return enum_for(__method__) { size }

  @row.delete_if(&block)

  self  # for chaining
end

Предоставленный block получает заголовок и поле для каждой пары в строке и должен возвращать true или false, в зависимости от того, должна ли пара быть удалена.

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

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

each(&block) Показать исходный код
# File lib/csv.rb, line 513
def each(&block)
  block or return enum_for(__method__) { size }

  @row.each(&block)

  self  # for chaining
end

Возвращает каждую пару строки в виде кортежа заголовок-поле (аналогично итерации по Hash). Этот метод возвращает строку для цепочки вызовов.

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

Поддержка Enumerable.

fetch( header ) Показать исходный код
fetch( header ) { |row| ... }
fetch( header, default )
# File lib/csv.rb, line 310
def fetch(header, *varargs)
  raise ArgumentError, "Too many arguments" if varargs.length > 1
  pair = @row.assoc(header)
  if pair
    pair.last
  else
    if block_given?
      yield header
    elsif varargs.empty?
      raise KeyError, "key not found: #{header}"
    else
      varargs.first
    end
  end
end

Этот метод извлекает значение поля по header. Он имеет такое же поведение, как Hash#fetch: если есть поле с заданным header, возвращается его значение. В противном случае, если задан блок, он передаёт header в блок, и возвращается результат блока; если в качестве второго аргумента задано значение по умолчанию, возвращается это значение; в противном случае возбуждается KeyError.

field( header ) Показать исходный код
field( header, offset )
field( index )
# File lib/csv.rb, line 284
def field(header_or_index, minimum_index = 0)
  # locate the pair
  finder = (header_or_index.is_a?(Integer) || header_or_index.is_a?(Range)) ? :[] : :assoc
  pair   = @row[minimum_index..-1].send(finder, header_or_index)

  # return the field if we have a pair
  if pair.nil?
    nil
  else
    header_or_index.is_a?(Range) ? pair.map(&:last) : pair.last
  end
end

Этот метод вернёт значение поля по header или index. Если поле не найдено, возвращается nil.

Если задан offset, гарантируется, что соответствие заголовка произойдёт на или после offset индекса. Это позволяет находить дублирующие заголовки, без привязки к конкретным индексам.

Также является псевдонимом для: []
field?(data) Показать исходный код
# File lib/csv.rb, line 499
def field?(data)
  fields.include? data
end

Возвращает true, если data соответствует полю в этой строке, и false в противном случае.

field_row?() Показать исходный код
# File lib/csv.rb, line 262
def field_row?
  not header_row?
end

Возвращает true, если это строка с полями.

fields(*headers_and_or_indices) Показать исходный код
# File lib/csv.rb, line 450
def fields(*headers_and_or_indices)
  if headers_and_or_indices.empty?  # return all fields--no arguments
    @row.map(&:last)
  else                              # or work like values_at()
    all = []
    headers_and_or_indices.each do |h_or_i|
      if h_or_i.is_a? Range
        index_begin = h_or_i.begin.is_a?(Integer) ? h_or_i.begin :
                                                    index(h_or_i.begin)
        index_end   = h_or_i.end.is_a?(Integer)   ? h_or_i.end :
                                                    index(h_or_i.end)
        new_range   = h_or_i.exclude_end? ? (index_begin...index_end) :
                                            (index_begin..index_end)
        all.concat(fields.values_at(new_range))
      else
        all << field(*Array(h_or_i))
      end
    end
    return all
  end
end

Этот метод принимает любое количество аргументов, которые могут быть заголовками, индексами, диапазонами любого типа или массивами из двух элементов, содержащими заголовок и смещение. Каждый аргумент будет заменён полем поиска, как описано в #field.

Если метод вызван без аргументов, возвращаются все поля.

Также является псевдонимом для: values_at
has_key?(header) Показать исходный код
# File lib/csv.rb, line 327
def has_key?(header)
  !!@row.assoc(header)
end

Возвращает true если есть поле с заданным header.

Также является псевдонимом для: include?, key?, member?
header?(name) Показать исходный код
# File lib/csv.rb, line 490
def header?(name)
  headers.include? name
end

Возвращает true если name является заголовком для этой строки, и false в противном случае.

Также является псевдонимом для: include?
header_row?() Показать исходный код
# File lib/csv.rb, line 257
def header_row?
  @header_row
end

Возвращает true если это строка заголовков.

headers() Показать исходный код
# File lib/csv.rb, line 267
def headers
  @row.map(&:first)
end

Возвращает заголовки этой строки.

include?(header)
Псевдоним для: has_key?
index( header ) Показать исходный код
index( header, offset )
# File lib/csv.rb, line 482
def index(header, minimum_index = 0)
  # find the pair
  index = headers[minimum_index..-1].index(header)
  # return the index at the right offset, if we found one
  index.nil? ? nil : index + minimum_index
end

Этот метод вернёт индекс поля с указанным header. offset используется для поиска дубликатов имён заголовков, как описано в #field.

inspect() Показать исходный код
# File lib/csv.rb, line 549
def inspect
  str = ["#<", self.class.to_s]
  each do |header, field|
    str << " " << (header.is_a?(Symbol) ? header.to_s : header.inspect) <<
           ":" << field.inspect
  end
  str << ">"
  begin
    str.join('')
  rescue  # any encoding error
    str.map do |s|
      e = Encoding::Converter.asciicompat_encoding(s.encoding)
      e ? s.encode(e) : s.force_encoding("ASCII-8BIT")
    end.join('')
  end
end

Краткое описание полей, по заголовкам, в строке ASCII.

END_OF_DOCUMENT_MARKER
key?(header)
Псевдоним для: has_key?
member?(header)
Псевдоним для: has_key?
push(*args) Показать исходный код
# File lib/csv.rb, line 399
def push(*args)
  args.each { |arg| self << arg }

  self  # for chaining
end

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

args.each { |arg| csv_row << arg }

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

to_csv(**options) Показать исходный код
# File lib/csv.rb, line 543
def to_csv(**options)
  fields.to_csv(options)
end

Возвращает строку в формате CSV строки. Заголовки не используются. Эквивалентно:

csv_row.fields.to_csv( options )
Также псевдоним для: to_s
to_hash() Показать исходный код
# File lib/csv.rb, line 534
def to_hash
  @row.to_h
end

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

to_s(**options)
Псевдоним для: to_csv
values_at(*headers_and_or_indices)
Псевдоним для: fields

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