Подтвердить что ты не робот

Ruby CSV - получить текущий номер строки/строки

Я пытаюсь выяснить, как получить номер строки/строки из Ruby CSV. Это мой код:

options = {:encoding => 'UTF-8', :skip_blanks => true}
CSV.foreach("data.csv", options, ) do |row, i|
   puts i
end

Но это не работает должным образом. Есть ли способ сделать это?

4b9b3361

Ответ 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"

Ответ 2

Здесь альтернативное решение:

options = {:encoding => 'UTF-8', :skip_blanks => true}

CSV.foreach("data.csv", options).with_index do |row, i|
   puts i
end

Ответ 3

Не чистое, но простое решение

options = {:encoding => 'UTF-8', :skip_blanks => true}
i = 0
CSV.foreach("data.csv", options) do | row |
  puts i
  i += 1
end