класс CSV::Row
Объект CSV::Row — это комбинация массива и хэша. Он сохраняет порядок полей и допускает дубликаты, как массив, но также позволяет получать доступ к полям по имени, как если бы они были в хэше.
Все строки, возвращаемые объектом CSV, будут созданы с использованием этого класса, если обработка заголовков включена.
Атрибуты
Внутренний формат данных, используемый для сравнения на равенство.
Публичные методы класса
# 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.
# 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]. Присвоение несуществующему заголовку добавляет новую пару.
# 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 если пара не найдена.
# File lib/csv.rb, line 433 def delete_if(&block) @row.delete_if(&block) self # for chaining end
Предоставленный block получает заголовок и поле для каждой пары в строке и должен возвращать true или false, в зависимости от того, следует ли удалять пару.
Этот метод возвращает строку для цепочки вызовов.
# File lib/csv.rb, line 508 def each(&block) @row.each(&block) self # for chaining end
Возвращает каждую пару строки в виде кортежей заголовок и поле (подобно итерации по хэшу).
Поддержка Enumerable.
Этот метод возвращает строку для цепочки вызовов.
# 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.
# 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 индекса. Это позволяет находить дублирующие заголовки, не прибегая к жёсткому кодированию точных индексов.
# File lib/csv.rb, line 494 def field?(data) fields.include? data end
Возвращает true, если data соответствует полю в этой строке, и false в противном случае.
# File lib/csv.rb, line 263 def field_row? not header_row? end
Возвращает true, если это строка поля.
# 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 Этот метод принимает любое количество аргументов, которые могут быть заголовками, индексами, диапазонами любого из них или массивами из двух элементов, содержащими заголовок и смещение. Каждый аргумент будет заменен поиском поля, как описано в #поле.
Если вызов осуществляется без аргументов, возвращаются все поля.
# File lib/csv.rb, line 328 def has_key?(header) !!@row.assoc(header) end
Возвращает true если есть поле с данным header.
# File lib/csv.rb, line 485 def header?(name) headers.include? name end
Возвращает true, если name является заголовком для этой строки, и false в противном случае.
# File lib/csv.rb, line 258 def header_row? @header_row end
Возвращает true, если это строка заголовка.
# File lib/csv.rb, line 268
def headers
@row.map { |pair| pair.first }
end Возвращает заголовки этой строки.
# 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 используется для поиска дублирующих имен заголовков, как описано в #поле.
# 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-совместимой строке.
# File lib/csv.rb, line 400
def push(*args)
args.each { |arg| self << arg }
self # for chaining
end Сокращение для добавления нескольких полей. Эквивалентно:
args.each { |arg| csv_row << arg }
Этот метод возвращает строку для цепочки вызовов.
# File lib/csv.rb, line 537 def to_csv(options = Hash.new) fields.to_csv(options) end
Возвращает строку в формате CSV. Заголовки не используются. Эквивалентно:
csv_row.fields.to_csv( options )
# 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. Имейте в виду, что порядок полей будет потерян, а дублирующиеся поля перезаписаны.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.