CSV::Table
class CSV::Table
Parent:ObjectIncluded modules:Enumerable
CSV :: Table是用于表示CSV文档的二维数据结构。通过表格,您可以按行或列处理数据,处理数据,甚至可以将结果转换回CSV(如果需要)。
如果标题行处理被激活,所有由CSV返回的表格将从这个类中构建。
属性
modeR
目前的索引和迭代访问模式。
tableR
用于比较相等的内部数据格式。
公共类方法
new(array_of_rows) Show source
构建一个新的CSV ::表array_of_rows
,它们预计为CSV :: Row对象。假定所有行具有相同的标题。
CSV :: Table对象通过委派支持以下Array方法:
- empty?()
- length()
- size()
# File lib/csv.rb, line 586
def initialize(array_of_rows)
@table = array_of_rows
@mode = :col_or_row
end
公共实例方法
<<(row_or_array)显示源文件
将新行添加到此表的底端。您可以提供一个数组,它将被转换为一个CSV :: Row(继承表头())或一个CSV :: Row。
此方法返回用于链接的表。
# File lib/csv.rb, line 784
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
==(other) Show source
如果此表==()other
的行的所有行都返回true
。
# File lib/csv.rb, line 871
def ==(other)
@table == other.table
end
显示来源
在默认混合模式下,此方法返回索引访问的行和列标题访问的列。您可以先调用#by_col!()或#by_row!()来强制索引关联。
列作为值的数组返回。改变该数组对表格没有影响。
# File lib/csv.rb, line 700
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
[]=(index_or_header, value) 显示源文件
在默认混合模式下,此方法为索引访问分配行并为报头访问分配列。您可以先调用#by_col!()或#by_row!()来强制索引关联。
行可以设置为值的数组(它将继承表头())或CSV :: Row。
列可以被设置为一个值,该值被复制到列的每一行或一组值。数组数组按行的主要顺序从上到下分配给行。超出的值将被忽略,如果数组没有每行的值,多余的行将会收到一个值nil
。
分配给现有的列或行会破坏数据。分配给新列创建它们在表的右端。
# File lib/csv.rb, line 725
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() 显示源文件
以列模式返回重复的表格对象。这对于在不改变表模式的情况下在单个调用中进行链接很方便,但请注意,此方法会为更大的数据集消耗相当数量的内存。
此方法返回用于链接的重复表。不要以这种方式链接破坏性方法(如[] =()),因为您正在处理重复。
# File lib/csv.rb, line 612
def by_col
self.class.new(@table.dup).by_col!
end
by_col!() 显示源文件
将此表的模式切换到列模式。对索引和迭代方法的所有调用都将与列一起工作,直到模式再次更改。
此方法返回表并且可以安全链接。
# File lib/csv.rb, line 622
def by_col!
@mode = :col
self
end
by_col_or_row() 显示源文件
以混合模式返回重复的表格对象。这对于在不改变表模式的情况下在单个调用中进行链接很方便,但请注意,此方法会为更大的数据集消耗相当数量的内存。
此方法返回用于链接的重复表。不要以这种方式链接破坏性方法(如[] =()),因为您正在处理重复。
# File lib/csv.rb, line 637
def by_col_or_row
self.class.new(@table.dup).by_col_or_row!
end
by_col_or_row!() 显示源文件
将此表的模式切换到混合模式。所有对索引和迭代方法的调用都将使用默认的智能索引系统,直到模式再次更改。在混合模式下,索引被假定为行引用,而其他任何东西都被假设为按列标题访问。
此方法返回表并且可以安全链接。
# File lib/csv.rb, line 649
def by_col_or_row!
@mode = :col_or_row
self
end
by_row() 显示源文件
以行模式返回重复的表格对象。这对于在不改变表模式的情况下在单个调用中进行链接很方便,但请注意,此方法会为更大的数据集消耗相当数量的内存。
此方法返回用于链接的重复表。不要以这种方式链接破坏性方法(如[] =()),因为您正在处理重复。
# File lib/csv.rb, line 664
def by_row
self.class.new(@table.dup).by_row!
end
by_row!()显示源文件
将此表的模式切换到行模式。对索引和迭代方法的所有调用都将与行一起使用,直到模式再次更改。
此方法返回表并且可以安全链接。
# File lib/csv.rb, line 674
def by_row!
@mode = :row
self
end
delete(index_or_header) 显示源文件
删除并返回指定的列或行。在默认混合模式索引中引用行,其他所有内容都假定为列标题。使用#by_col!()或#by_row!()强制查找。
# File lib/csv.rb, line 812
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
delete_if(&block) 显示源文件
删除块返回的任何列或行true
。在默认混合模式或行模式下,迭代是行的标准行主要步行。在列模式下,迭代将yield
包含两个元素元组,其中包含列名和该列的值数组。
此方法返回用于链接的表。
如果没有给出块,则返回枚举器。
# File lib/csv.rb, line 831
def delete_if(&block)
block or return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size }
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
each(&block) 显示源文件
在默认混合模式或行模式下,迭代是行的标准行主要步行。在列模式下,迭代将yield
包含两个元素元组,其中包含列名和该列的值数组。
此方法返回用于链接的表。
如果没有给出块,则返回枚举器。
# File lib/csv.rb, line 858
def each(&block)
block or return enum_for(__method__) { @mode == :col ? headers.size : size }
if @mode == :col
headers.each { |header| block[[header, self[header]]] }
else
@table.each(&block)
end
self # for chaining
end
headers() 显示源文件
返回此表第一行的标题(假定与所有其他行匹配)。空表返回空数组。
# File lib/csv.rb, line 684
def headers
if @table.empty?
Array.new
else
@table.first.headers
end
end
inspect() 显示源文件
以US-ASCII字符串显示此表的模式和大小。
# File lib/csv.rb, line 909
def inspect
"#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>".encode("US-ASCII")
end
push(*rows) 显示源文件
追加多行的快捷方式。相当于:
rows.each { |row| self << row }
此方法返回用于链接的表。
# File lib/csv.rb, line 801
def push(*rows)
rows.each { |row| self << row }
self # for chaining
end
to_a() 显示源文件
以阵列数组的形式返回表。头将是第一行,然后所有的字段行都会跟随。
# File lib/csv.rb, line 879
def to_a
@table.inject([headers]) do |array, row|
if row.header_row?
array
else
array + [row.fields]
end
end
end
to_csv(options = Hash.new) 显示源文件
以完整的CSV字符串形式返回表格。首先列出标题,然后列出所有字段行。
这种方法假定你想要#headers,除非你明确通过:write_headers => false。
# File lib/csv.rb, line 896
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
另外别名为:to_s
to_s(options = Hash.new)
别名为:to_csv
values_at(*indices_or_headers) 显示源文件
混合模式默认是将索引列表视为行访问,返回指示的行。其他任何被视为列访问。对于列式访问,返回集每个行都有一个数组,每个数组中的标题指示值。您可以使用#by_col!()或#by_row!()强制列或行模式。
您不能混合列和行访问。
# File lib/csv.rb, line 763
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