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