从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