класс CSV::Row
Объект CSV::Row — это комбинация массива и хэша. Он сохраняет порядок полей и допускает дубликаты, как массив, но также позволяет получать доступ к полям по имени, как если бы они были в хэше.
Все строки, возвращаемые объектом CSV, будут созданы с использованием этого класса, если обработка заголовков включена.
Атрибуты
Внутренний формат данных, используемый для сравнения на равенство.
Публичные методы класса
# 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).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 376
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 Если предоставлен двумерный массив, предполагается, что это заголовок и поле, и пара добавляется. Hash работает аналогично, где ключ является заголовком, а значение — полем. Всё остальное считается отдельным полем, которое добавляется с заголовком nil.
Этот метод возвращает строку для цепочки вызовов.
# File lib/csv.rb, line 513 def ==(other) return @row == other.row if other.is_a? CSV::Row @row == other end
Возвращает true, если эта строка содержит те же заголовки и поля в том же порядке, что и other.
# File lib/csv.rb, line 343
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]. Присваивание неиспользуемому заголовку добавляет новую пару.
# File lib/csv.rb, line 411
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, если пара не найдена.
# File lib/csv.rb, line 428 def delete_if(&block) @row.delete_if(&block) self # for chaining end
Предоставленный block передаётся заголовок и поле для каждой пары в строке, и ожидается, что он вернёт true или false, в зависимости от того, следует ли удалять пару.
Этот метод возвращает строку для цепочки вызовов.
# File lib/csv.rb, line 503 def each(&block) @row.each(&block) self # for chaining end
Выдаёт каждую пару строки в виде кортежей заголовок-поле (подобно итерации по Hash).
Поддержка для Enumerable.
Этот метод возвращает строку для цепочки вызовов.
# File lib/csv.rb, line 306
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 284 def field(header_or_index, minimum_index = 0) # locate the pair finder = header_or_index.is_a?(Integer) ? :[] : :assoc pair = @row[minimum_index..-1].send(finder, header_or_index) # return the field if we have a pair pair.nil? ? nil : pair.last end
Этот метод вернёт значение поля по header или index. Если поле не найдено, возвращается nil.
При предоставлении, offset гарантирует, что совпадение заголовка происходит в индексе offset или позже. Вы можете использовать это для поиска дубликатов заголовков, не прибегая к жёсткому кодированию точных индексов.
# File lib/csv.rb, line 489 def field?(data) fields.include? data end
Возвращает true, если data совпадает с полем в этой строке, и false в противном случае.
# File lib/csv.rb, line 262 def field_row? not header_row? end
Возвращает true, если это строка поля.
# File lib/csv.rb, line 442
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 Этот метод принимает любое количество аргументов, которые могут быть заголовками, индексами, диапазонами любого из них или двумерными массивами, содержащими заголовок и смещение. Каждый аргумент будет заменён поиском поля, как описано в #field.
Если вызывается без аргументов, возвращаются все поля.
# File lib/csv.rb, line 323 def has_key?(header) !!@row.assoc(header) end
Возвращает true, если есть поле с заданным header.
# File lib/csv.rb, line 480 def header?(name) headers.include? name end
Возвращает true, если name является заголовком для этой строки, и false в противном случае.
# File lib/csv.rb, line 257 def header_row? @header_row end
Возвращает true, если это строка заголовка.
# File lib/csv.rb, line 267
def headers
@row.map { |pair| pair.first }
end Возвращает заголовки этой строки.
# File lib/csv.rb, line 472 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.
# File lib/csv.rb, line 538
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 395
def push(*args)
args.each { |arg| self << arg }
self # for chaining
end Сокращение для добавления нескольких полей. Эквивалентно:
args.each { |arg| csv_row << arg }
Этот метод возвращает строку для цепочки вызовов.
# File lib/csv.rb, line 532 def to_csv(options = Hash.new) fields.to_csv(options) end
Возвращает строку в формате CSV. Заголовки не используются. Эквивалентно:
csv_row.fields.to_csv( options )
# File lib/csv.rb, line 522
def to_hash
# flatten just one level of the internal Array
Hash[*@row.inject(Array.new) { |ary, pair| ary.push(*pair) }]
end Преобразует строку в простой словарь. Обратите внимание, что порядок полей игнорируется, а дублирующие поля перезаписываются.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.