класс CSV::Table
A CSV::Table — это двумерная структура данных для представления CSV документов. Таблицы позволяют работать с данными по строкам или столбцам, обрабатывать данные и даже преобразовывать результаты обратно в CSV, если необходимо.
Все таблицы, возвращаемые CSV, будут созданы из этого класса, если обработка заголовков включена.
Атрибуты
Текущий режим доступа для индексирования и итерации.
Внутренний формат данных, используемый для сравнения на равенство.
Открытые методы класса
# 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()
Общедоступные методы экземпляров
# 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.
Этот метод возвращает таблицу для цепочки вызовов.
# File lib/csv/table.rb, line 344 def ==(other) return @table == other.table if other.is_a? CSV::Table @table == other end
Возвращает true , если все строки этой таблицы ==() other строки.
# 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 не влияет на таблицу.
# 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.
Присвоение существующему столбцу или строке перезаписывает данные. Присвоение новым столбцам создает их в правой части таблицы.
# File lib/csv/table.rb, line 66 def by_col self.class.new(@table.dup).by_col! end
Возвращает дубликат объекта таблицы в режиме столбцов. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.
Этот метод возвращает дубликат таблицы для цепочки вызовов. Не используйте цепочку деструктивных методов (например, []=()) таким образом, так как вы работаете с дубликатом.
# File lib/csv/table.rb, line 76 def by_col! @mode = :col self end
Переключает режим этой таблицы на столбцовый режим. Все вызовы методов индексирования и итерации будут работать со столбцами, пока режим не будет изменён снова.
Этот метод возвращает таблицу и может быть использован в цепочке вызовов.
# File lib/csv/table.rb, line 91 def by_col_or_row self.class.new(@table.dup).by_col_or_row! end
Возвращает дубликат объекта таблицы в смешанном режиме. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.
Этот метод возвращает дубликат таблицы для цепочки вызовов. Не используйте цепочку деструктивных методов (например, []=()) таким образом, так как вы работаете с дубликатом.
# File lib/csv/table.rb, line 103 def by_col_or_row! @mode = :col_or_row self end
Переключает режим этой таблицы на смешанный режим. Все вызовы методов индексирования и итерации будут использовать стандартную систему интеллектуального индексирования, пока режим не будет изменён снова. В смешанном режиме индекс предполагается как ссылка на строку, а все остальное — как доступ к столбцу по заголовкам.
Этот метод возвращает таблицу и может быть использован в цепочке вызовов.
# File lib/csv/table.rb, line 118 def by_row self.class.new(@table.dup).by_row! end
Возвращает дубликат объекта таблицы в режиме строк. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.
Этот метод возвращает дубликат таблицы для цепочки вызовов. Не используйте цепочку деструктивных методов (например, []=()) таким образом, так как вы работаете с дубликатом.
# File lib/csv/table.rb, line 128 def by_row! @mode = :row self end
Переключает режим этой таблицы на режим строк. Все вызовы методов индексирования и итерации будут работать со строками, пока режим не будет изменён снова.
Этот метод возвращает таблицу и может быть использован в цепочке вызовов.
# 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!() для принудительного поиска.
# 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.
# 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.
# 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.
# File lib/csv/table.rb, line 139
def headers
if @table.empty?
@headers.dup
else
@table.first.headers
end
end Возвращает заголовки для первой строки этой таблицы (предполагается, что они совпадают со всеми другими строками). Array заголовков, переданных в CSV::Table.new, возвращаются для пустых таблиц.
# File lib/csv/table.rb, line 398
def inspect
"#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>".encode("US-ASCII")
end Отображает режим и размер этой таблицы в String ASCII.
# File lib/csv/table.rb, line 260
def push(*rows)
rows.each { |row| self << row }
self # for chaining
end Сокращение для добавления нескольких строк. Эквивалентно:
rows.each { |row| self << row }
Этот метод возвращает таблицу для цепочки вызовов.
# 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 массивов. Заголовки будут первой строкой, а затем последуют все строки с данными.
# 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.
# 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.