2014-10-20 83 views
1

我使用下面的代码来读取压缩CSV文件的内容。如何读取压缩CSV文件的特定列

Zip::ZipFile.foreach(file) do |entry| 
    istream = entry.get_input_stream 
    data = istream.read 
    #... 
end 

它给我的整个文本内容(CSV)与头文件,象下面这样:

NAME AGE GENDER NAME1 29 MALE NAME2 30 FEMALE 

但我需要列的具体数据。例如,我只想显示名称(NAME)。请帮我解决这个问题。

回答

3

虽然你的例子显示ZipFile中,你真的问一个CSV问题。首先,你应该检查文档http://www.ruby-doc.org/stdlib-2.0/libdoc/csv/rdoc/CSV.html

你会发现,如果你使用:headers => true选项解析你的数据,你会得到一个知道如何提取一列数据的CSV::table对象,如下。 (出于显而易见的原因,我不会编写这种方式 - 这只是举例)

require 'zip' 
require 'csv' 

csv_table = nil 
Zip::ZipFile.foreach("x.csv.zip") do |entry| 
    istream = entry.get_input_stream 
    data = istream.read 
    csv_table = CSV.parse(data, :col_sep => " ", :headers => true) 
end 

随着你给的数据,我们需要'col_sep =>“”因为你使用空格作为列分隔符。但现在我们可以做到:

>> csv_table["NAME"] # extract the NAME column 
=> ["NAME1", "NAME2"] 
+0

很棒:)谢谢你soo .. – user28 2014-10-20 07:31:11

0

首先,你可以用这个作为参考:

http://www.ruby-doc.org/stdlib-2.0/libdoc/csv/rdoc/CSV.html

如果你有一个字符串,你可以做

array = CSV.parse("data") 

这会给你一个数组的数组,每行一个。 现在,如果你知道,每行的第一列是名字你可以操作该阵列即

array.map { |line| line[0] }.join(",") # returns NAME,<name>,<name>,<name> ...