【问题标题】:How to read specific columns of a zipped CSV file如何读取压缩 CSV 文件的特定列
【发布时间】:2014-10-20 06:49:44
【问题描述】:

我使用下面的代码读取压缩的 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)。请帮我继续。

【问题讨论】:

    标签: ruby csv rubyzip


    【解决方案1】:

    虽然您的示例显示了 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"]
    

    【讨论】:

      【解决方案2】:

      首先你可以参考一下:

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

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多