【发布时间】: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
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
如果没有给出块,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 运行,以查看每个示例输出了多少次“移动行”。
【讨论】:
second_row=CSV.foreach('test.csv').lazy.take(2).last 应该也能正常工作,不是吗?
如果你想要整行,你应该改变
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
【讨论】:
break,因为 OP 说他不想处理整个文件。