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

如果没有给出块,则foreach方法返回枚举器,这允许您使用诸如从Enumerable drop方法:

 # 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运行以查看每个示例输出“shift row”的次数。

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

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