Fetching second row from csv file in Ruby [duplicate]

我怕爱的太早我们不能终老 提交于 2019-12-02 14:38:27

问题


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

With this I am trying to fetch the second row of CSV but it is printing the second column instead.


回答1:


The foreach method returns an enumerator if no block is given, which allows you to use methods such as drop from Enumerable:

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

To limit to just one row, we can then take:

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

But, we're still parsing the entire file and just discarding most of it. Luckily, we can add lazy into the mix:

# 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 }

But, if the first row is a header row, don't forgot you can tell CSV about it:

# 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 }

As an aside (in case I did this wrong), it looks like the shift method is what CSV is using for parsing the rows, so I just added:

class CSV
  alias :orig_shift :shift

  def shift
    $stdout.puts "shifting row"

    orig_shift
  end
end

and ran with a sample csv to see how many times "shifting row" was output for each of the examples.




回答2:


If you'd like the entire row, you should change

row[1]

to just

row

row[1] is grabbing the second column's value of the entire row. Each column value is stored sequentially in the row variable. You can see this directly in your console if you print

puts row.inspect

If you want just the second row, you can try something like this:

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

You can learn more about $. and similar variables here: https://docs.ruby-lang.org/en/2.4.0/globals_rdoc.html



来源:https://stackoverflow.com/questions/49144203/fetching-second-row-from-csv-file-in-ruby

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!