Ответ 1
$.
Ruby имеет магическую переменную $.
, которая является номером строки текущего файла, который читается:
require 'csv'
CSV.foreach('test.csv') do |csv|
puts $.
end
Если я прочитал:
Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!\nair, moon roof, loaded",4799.00
с кодом выше, я получаю:
1
2
3
4
5
$INPUT_LINE_NUMBER
$.
используется все время в Perl. В Ruby рекомендуется использовать его следующим образом, чтобы избежать "магической" стороны:
require 'english'
puts $INPUT_LINE_NUMBER
Если необходимо обрабатывать встроенные концы строк в полях, он легко обрабатывается незначительной модификацией. Предположим, что CSV файл "test.csv" содержит строку со встроенной новой строкой:
Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00
1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00
with_index
Использование Enumerator with_index(1)
позволяет легко отслеживать количество выходов CSV в блок, эффективно имитируя с помощью $.
но соблюдение CSV-работы при чтении дополнительных строк, необходимых для обработки строк:
require 'csv'
CSV.foreach('test.csv', headers: true).with_index(1) do |row, ln|
puts '%-3d %-5s %-26s %s' % [ln, *row.values_at('Make', 'Model', 'Description')]
end
Что при запуске выдает:
$ ruby test.rb
1 Ford E350 ac, abs, moon
2 Chevy Venture "Extended Edition"
3 Jeep Grand Cherokee MUST SELL!
air, moon roof, loaded
4 Chevy Venture "Extended Edition, Very Large"