在处理文件时,我曾经使用特殊变量$.
来获取最后读取的行号。例如,以下程序
require 'csv'
IFS=';'
CSV_OPTIONS = { col_sep: IFS, external_encoding: Encoding::ISO_8859_1, internal_encoding: Encoding::UTF_8 }
CSV.new($stdin, CSV_OPTIONS).each do |row|
puts "::::line #{$.} row=#{row}"
end
应该转储一个CSV文件(在字段中,该字段由分号而不是逗号分隔,在我们的项目中就是这种情况),并在每个输出行前添加行号。
将Ruby更新为
_ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-cygwin]_
行仍被转储,但行号始终显示为零。
令我吃惊的是,这个特殊的Ruby变量上的Ruby Wiki尽管列表中仍然有$.
,但不再对此变量进行描述。所以我想知道:这个变量消失了吗?或者它永远不应该与 csv 类一起使用,而只是在早期版本中为我偶然使用了?
答案 0 :(得分:1)
我不确定$.
为何不能为您服务,但这也不是最好的解决方案。当它起作用时,$.
会为您提供从输入读取的行数,但是由于CSV文件中的带引号的字段可以跨越多行,因此您从$.
获得的数并不总是< em>行已被读取。
如上所述,each_with_index
是一个很好的选择:
CSV.new($stdin, CSV_OPTIONS).each_with_index do |row, i|
puts "::::row #{i} row=#{row}"
end
另一种选择是CSV#lineno
:
lineno()
从该文件读取的最后一行的行号。带有行尾字符嵌套的字段不会影响此计数。
您将像这样使用它:
csv = CSV.new($stdin, CSV_OPTIONS)
csv.each do |row|
puts "::::row #{csv.lineno} row=#{row}"
end
请注意,each_with_index
从0开始计数,而lineno
从1开始计数。
您可以在repl.it上看到两种方法都在起作用:https://repl.it/@jrunning/LoudBlushingCharactercode