Spec-Zone.ru › Ruby 2.3

класс CSV::Row

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

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

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

Атрибуты

row[R]

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

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

new(headers, fields, header_row = false) Показать исходный код
# File lib/csv.rb, line 236
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).map { |pair| pair.reverse! }
  end
end

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

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

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

  • empty?()

  • length()

  • size()

Методы публичного экземпляра

<<( поле ) Показать исходный код
<<( массив_заголовка_и_поля )
<<( хэш_заголовка_и_поля )
# File lib/csv.rb, line 381
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.

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

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

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

[](заголовок_или_индекс, минимальный_индекс = 0)
Псевдоним для: поле
[]=( заголовок, значение ) Показать исходный код
[]=( заголовок, смещение, значение )
[]=( индекс, значение )
# File lib/csv.rb, line 348
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

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

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

delete( заголовок ) Показать исходный код
delete( заголовок, смещение )
delete( индекс )
# File lib/csv.rb, line 416
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. Пара ищется как описано в #поле. Удаленная пара возвращается, или nil если пара не найдена.

delete_if(&блок) Показать исходный код
# File lib/csv.rb, line 433
def delete_if(&block)
  @row.delete_if(&block)

  self  # for chaining
end

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

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

each(&блок) Показать исходный код
# File lib/csv.rb, line 508
def each(&block)
  @row.each(&block)

  self  # for chaining
end

Возвращает каждую пару строки в виде кортежей заголовок и поле (подобно итерации по хэшу).

Поддержка Enumerable.

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

fetch( заголовок ) Показать исходный код
fetch( заголовок ) { |строка| ... }
fetch( заголовок, значение_по_умолчанию )
# File lib/csv.rb, line 311
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 и возвращается его результат; если в качестве второго аргумента задано default, возвращается оно; в противном случае возникает KeyError.

field( заголовок ) Показать исходный код
field( заголовок, смещение )
field( индекс )
# File lib/csv.rb, line 285
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?(данные) Показать исходный код
# File lib/csv.rb, line 494
def field?(data)
  fields.include? data
end

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

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

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

fields(*заголовки_и_или_индексы) Показать исходный код
# File lib/csv.rb, line 447
def fields(*headers_and_or_indices)
  if headers_and_or_indices.empty?  # return all fields--no arguments
    @row.map { |pair| pair.last }
  else                              # or work like values_at()
    headers_and_or_indices.inject(Array.new) do |all, h_or_i|
      all + 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)
        fields.values_at(new_range)
      else
        [field(*Array(h_or_i))]
      end
    end
  end
end

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

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

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

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

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

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

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

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

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

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

include?(заголовок)
Псевдоним для: has_key?
index( заголовок ) Показать исходный код
index( заголовок, смещение )
# File lib/csv.rb, line 477
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 используется для поиска дублирующих имен заголовков, как описано в #поле.

inspect() Показать исходный код
# File lib/csv.rb, line 543
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-совместимой строке.

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

  self  # for chaining
end

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

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

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

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

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

csv_row.fields.to_csv( options )
Также использует псевдоним: to_s
to_hash() Показать исходный код
# File lib/csv.rb, line 527
def to_hash
  # flatten just one level of the internal Array
  Hash[*@row.inject(Array.new) { |ary, pair| ary.push(*pair) }]
end

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

to_s(options = Hash.new)
Псевдоним для: 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