класс CSV::Table
Класс CSV::Table — это двумерная структура данных для представления документов CSV. Таблицы позволяют работать с данными по строкам или столбцам, манипулировать данными и даже преобразовывать результаты обратно в CSV, если это необходимо.
Все таблицы, возвращаемые классом CSV, будут созданы из этого класса, если обработка заголовков включена.
Атрибуты
Текущий режим доступа для индексирования и итерации.
Внутренний формат данных, используемый для сравнения на равенство.
Публичные методы класса
# File lib/csv.rb, line 581 def initialize(array_of_rows) @table = array_of_rows @mode = :col_or_row end
Создает новый объект CSV::Table из array_of_rows, которые, как ожидается, являются объектами CSV::Row. Предполагается, что все строки имеют одинаковые заголовки.
Объект CSV::Table поддерживает следующие методы класса `Array` через делегирование:
-
empty?()
-
length()
-
size()
Публичные методы экземпляра
# File lib/csv.rb, line 779
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 Добавляет новую строку в конец этой таблицы. Вы можете указать массив, который будет преобразован в CSV::Row (наследующий заголовки таблицы), или CSV::Row.
Этот метод возвращает таблицу для цепочки вызовов.
# File lib/csv.rb, line 858 def ==(other) @table == other.table end
Возвращает true если все строки этой таблицы ==() строки other.
# File lib/csv.rb, line 695
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!().
Столбцы возвращаются как массив значений. Изменение этого массива не влияет на таблицу.
# File lib/csv.rb, line 720
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
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!().
Строки могут быть установлены в массив значений (который будет наследовать заголовки таблицы) или CSV::Row.
Столбцам может быть присвоено одно значение, которое копируется в каждую строку столбца, или массив значений. Массивы значений присваиваются строкам сверху вниз в порядке следования строк. Лишние значения игнорируются, и если массив не имеет значения для каждой строки, дополнительные строки получат nil.
Присвоение существующему столбцу или строке перезаписывает данные. Присвоение новым столбцам создает их в конце таблицы.
# File lib/csv.rb, line 607 def by_col self.class.new(@table.dup).by_col! end
Возвращает дублирующий объект таблицы в режиме столбцов. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.
Этот метод возвращает дубликат таблицы для цепочки вызовов. Однако не цепляйте деструктивные методы (например, []=()) таким образом, поскольку вы работаете с дубликатом.
# File lib/csv.rb, line 617 def by_col! @mode = :col self end
Переключает режим этой таблицы в режим столбцов. Все вызовы методов индексации и итерации будут работать со столбцами, пока режим не будет изменен снова.
Этот метод возвращает таблицу и безопасен для цепочки вызовов.
# File lib/csv.rb, line 632 def by_col_or_row self.class.new(@table.dup).by_col_or_row! end
Возвращает дублирующий объект таблицы в смешанном режиме. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.
Этот метод возвращает дубликат таблицы для цепочки вызовов. Однако не цепляйте деструктивные методы (например, []=()) таким образом, поскольку вы работаете с дубликатом.
# File lib/csv.rb, line 644 def by_col_or_row! @mode = :col_or_row self end
Переключает режим этой таблицы в смешанный режим. Все вызовы методов индексации и итерации будут использовать стандартную интеллектуальную систему индексации, пока режим не будет изменен снова. В смешанном режиме индекс считается ссылкой на строку, а все остальное считается доступом к столбцу по заголовкам.
Этот метод возвращает таблицу и безопасен для цепочки вызовов.
# File lib/csv.rb, line 659 def by_row self.class.new(@table.dup).by_row! end
Возвращает дублирующий объект таблицы в режиме строк. Это удобно для цепочки вызовов в одном вызове без изменения режима таблицы, но имейте в виду, что этот метод может потреблять значительное количество памяти для больших наборов данных.
Этот метод возвращает дубликат таблицы для цепочки вызовов. Однако не цепляйте деструктивные методы (например, []=()) таким образом, поскольку вы работаете с дубликатом.
# File lib/csv.rb, line 669 def by_row! @mode = :row self end
Переключает режим этой таблицы в режим строк. Все вызовы методов индексации и итерации будут работать со строками, пока режим не будет изменен снова.
Этот метод возвращает таблицу и безопасен для цепочки вызовов.
# File lib/csv.rb, line 807
def delete(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
@table.map { |row| row.delete(index_or_header).last }
end
end Удаляет и возвращает указанный столбец или строку. В режиме смешанного доступа по умолчанию индексы относятся к строкам, а все остальное считается заголовком столбца. Используйте #by_col!() или #by_row!() для принудительного поиска.
# File lib/csv.rb, line 824
def delete_if(&block)
if @mode == :row or @mode == :col_or_row # by index
@table.delete_if(&block)
else # by header
to_delete = Array.new
headers.each_with_index do |header, i|
to_delete << header if block[[header, self[header]]]
end
to_delete.map { |header| delete(header) }
end
self # for chaining
end Удаляет любой столбец или строку, для которых блок возвращает true. В режиме смешанного доступа по умолчанию или в режиме строк, итерация представляет собой стандартный проход по строкам в порядке следования строк. В режиме столбцов итерация будет yield двухэлементные кортежи, содержащие имя столбца и массив значений для этого столбца.
Этот метод возвращает таблицу для цепочки вызовов.
# File lib/csv.rb, line 847
def each(&block)
if @mode == :col
headers.each { |header| block[[header, self[header]]] }
else
@table.each(&block)
end
self # for chaining
end В режиме смешанного доступа по умолчанию или в режиме строк, итерация представляет собой стандартный проход по строкам в порядке следования строк. В режиме столбцов итерация будет yield двухэлементные кортежи, содержащие имя столбца и массив значений для этого столбца.
Этот метод возвращает таблицу для цепочки вызовов.
# File lib/csv.rb, line 679
def headers
if @table.empty?
Array.new
else
@table.first.headers
end
end Возвращает заголовки для первой строки этой таблицы (предполагается, что они совпадают со всеми другими строками). Для пустых таблиц возвращается пустой массив.
# File lib/csv.rb, line 896
def inspect
"#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>".encode("US-ASCII")
end Показывает режим и размер этой таблицы в строке US-ASCII.
# File lib/csv.rb, line 796
def push(*rows)
rows.each { |row| self << row }
self # for chaining
end Сокращение для добавления нескольких строк. Эквивалентно:
rows.each { |row| self << row }
Этот метод возвращает таблицу для цепочки вызовов.
# File lib/csv.rb, line 866
def to_a
@table.inject([headers]) do |array, row|
if row.header_row?
array
else
array + [row.fields]
end
end
end Возвращает таблицу как массив массивов. Заголовки будут первой строкой, затем последуют все строки полей.
# File lib/csv.rb, line 883
def to_csv(options = Hash.new)
wh = options.fetch(:write_headers, true)
@table.inject(wh ? [headers.to_csv(options)] : [ ]) do |rows, row|
if row.header_row?
rows
else
rows + [row.fields.to_csv(options)]
end
end.join('')
end Возвращает таблицу как полную строку CSV. Заголовки будут перечислены первыми, затем все строки полей.
Этот метод предполагает, что вам нужны #headers, если вы явно не передадите :write_headers => false.
# File lib/csv.rb, line 758
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 По умолчанию в смешанном режиме список индексов обрабатывается как доступ к строкам, возвращая указанные строки. Всё остальное рассматривается как доступ к столбцам. При доступе к столбцам возвращаемый набор содержит массив для каждой строки, содержащий значения, указанные в заголовках в каждом массиве. Вы можете принудительно задать режим столбцов или строк, используя #by_col!() или #by_row!().
Смешанный доступ к столбцам и строкам невозможен.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.