从Ruby中的csv文件中获取第二行

时间:2018-03-07 04:35:04

标签: ruby export-to-csv

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,但它正在打印第二列。

2 个答案:

答案 0 :(得分:2)

如果没有给出阻止,foreach方法会返回一个枚举器,这允许您使用来自Enumerable的{​​{3}}等方法:

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

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

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

但是,我们仍在解析整个文件,只是放弃了大部分文件。幸运的是,我们可以在混合中添加take

# 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运行以查看有多少次&#34;转移行&#34;为每个例子输出了。

答案 1 :(得分:1)

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

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