2014-10-20 3 views
1

Я использовал следующий код, чтобы прочитать содержимое файла CSV с zip-файлом.Как читать определенные столбцы файла CSV с zipped

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

Отлично работает :) Спасибо, много .. – user28

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> ... 

 Смежные вопросы

  • Нет связанных вопросов^_^