【问题标题】:Fetching second row from csv file in Ruby [duplicate]从Ruby中的csv文件中获取第二行[重复]
【发布时间】:2018-03-07 04:35:03
【问题描述】:
actual_row = File.open(file_name[0], 'r')
 first_row_data = []
 CSV.foreach(actual_row) do |row| 
first_row_data << row[1]
 end 
puts first_row_data

我正在尝试获取 CSV 的第二行,但它正在打印第二列。

【问题讨论】:

    标签: ruby export-to-csv


    【解决方案1】:

    如果没有给出块,foreach 方法会返回一个枚举器,这允许您使用来自Enumerabledrop 等方法:

    # outputs all rows after the first
    CSV.foreach('test.csv').drop(1).each { |row| puts row.inspect }
    

    要限制为一行,我们可以take

    # outputs only the second row
    CSV.foreach('test.csv').drop(1).take(1).each { |row| puts row.inspect }
    

    但是,我们仍在解析整个文件并丢弃其中的大部分内容。幸运的是,我们可以将lazy 添加到组合中:

    # outputs only the second row, parsing only the first 2 rows of the file
    CSV.foreach('test.csv').lazy.drop(1).take(1).each { |row| puts row.inspect }
    

    但是,如果第一行是标题行,别忘了你可以告诉 CSV:

    # outputs only the second row, as a CSV::Row, only parses 2 rows
    CSV.foreach('test.csv', headers: true).take(1).each { |row| puts row.inspect }
    

    顺便说一句(以防我做错了),看起来 shift 方法是 CSV 用于解析行的方法,所以我只是添加了:

    class CSV
      alias :orig_shift :shift
    
      def shift
        $stdout.puts "shifting row"
    
        orig_shift
      end
    end
    

    并使用示例 csv 运行,以查看每个示例输出了多少次“移动行”。

    【讨论】:

    • 好主意!!!!在这种情况下,second_row=CSV.foreach('test.csv').lazy.take(2).last 应该也能正常工作,不是吗?
    【解决方案2】:

    如果你想要整行,你应该改变

    row[1]

    只是

    row

    row[1] 正在获取整行的第二列的值。每个列值都按顺序存储在行变量中。如果您打印,您可以直接在控制台中看到它

    puts row.inspect

    如果你只想要第二行,你可以试试这样:

    actual_row = File.open(file_name[0], 'r')
    first_row_data = []
    CSV.foreach(actual_row) do |row| 
      if $. == 1
        first_row_data << row
      end
    end 
    puts first_row_data
    

    您可以在此处了解有关 $. 和类似变量的更多信息:https://docs.ruby-lang.org/en/2.4.0/globals_rdoc.html

    【讨论】:

    • 如果我只想获取第二行怎么办。使用“row”它一次获取所有行。
    • 嗨@surabhi8960 - 我已经更新了答案,让你知道如何只抓住第二行。
    • 非常感谢安东尼 L
    • @AnthonyL :我认为你应该在存储行后添加一个break,因为 OP 说他不想处理整个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2019-05-03
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多