使用Ruby CSV提取一列

eaf3rand  于 12个月前  发布在  Ruby
关注(0)|答案(3)|浏览(104)

我一直在尝试从csv文件中提取一列。
我已经看过了http://www.ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html的文档,但仍然不知道如何使用它。
如果我使用CSV.table,与CSV.read相比,响应速度非常慢。我承认我正在加载的数据集非常大,这正是我只想从中获取单个列的原因。
我的请求现在看起来像这样

@dataTable = CSV.table('path_to_csv.csv')

当我调试的时候我得到的响应是

#<CSV::Table mode:col_or_row row_count:2104 >

文档说我应该可以使用by_col(),但是当我尝试输出

<%= debug @dataTable.by_col('col_name or index') %>

它给了我“undefined method 'col' error”
有人能给我解释一下如何使用CSV吗?如果有一种方法可以更快地获得列使用'读'而不是'表'?
我正在使用Ruby 1.92,它说它使用FasterCSV,所以我不需要使用FasterCSV gem。

n3schb8v

n3schb8v1#

要从CSV中提取列,我可能会执行以下操作:

col_data = []
CSV.foreach(FILENAME) {|row| col_data << row[COL_INDEX]}

这应该比CSV上的任何操作都要快得多。

nzkunb0c

nzkunb0c2#

您可以使用以下代码片段从csv文件的单个列中获取值。

@dataTable = CSV.table('path_to_csv.csv')
@dataTable[:columnname]
g2ieeal7

g2ieeal73#

我发现这对我很有效(我在这里使用了OP的变量名):

@dataTable = CSV.read('path_to_csv.csv')
@dataTable.by_col!
p @dataTable.values_at('Field1')

这将打印列Field1中的所有值,作为一个包含一个元素的数组的数组:[value1],[value2],[value3]...等等。所以

p @dataTable.values_at('Field1').flatten

将在一个数组中打印Field1列中的所有值。
如果你想一个接一个地遍历一个表中的所有字段,那么这里有一种方法可以做到这一点。首先,您必须进行转换,以便索引引用列而不是行,使用by_col!。然后索引将引用列而不是行,你可以这样做:

@dataTable = CSV.read('path_to_csv.csv')
@dataTable.by_col!

0.upto(@dataTable.headers.size - 1) do |i|
  p @dataTable.values_at(i).flatten.compact.size # Or whatever you want here
end

这是一种从CSV文件中处理汇总值的方法,然后可以使用该汇总值创建数据透视表。如果需要从CSV文件输入数据并以数据透视表的形式输出汇总数据,这可能是一种直接的方法。

相关问题