Ruby CSV – obtenir le numéro de ligne / ligne actuel

J’essaie de savoir comment obtenir le numéro de ligne / ligne actuel de Ruby CSV. Ceci est mon code:

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

Mais cela ne semble pas fonctionner comme prévu. Y a-t-il un moyen de faire cela?

$.

Ruby a une variable magique $. quel est le numéro de ligne du fichier en cours de lecture:

 require 'csv' CSV.foreach('test.csv') do |csv| puts $. end 

Si je lis:

 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 

avec le code ci-dessus, je reçois:

 1 2 3 4 5 

$INPUT_LINE_NUMBER

$. est utilisé tout le temps en Perl. Dans Ruby, il est recommandé de l’utiliser de la manière suivante pour éviter le côté “magique”:

 require 'english' puts $INPUT_LINE_NUMBER 

S’il est nécessaire de traiter des fins de ligne intégrées dans des champs, il est facile de le gérer grâce à une modification mineure. En supposant un fichier CSV “test.csv” qui contient une ligne avec une nouvelle ligne incorporée:

 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

L’utilisation de l’ with_index(1) Enumerator facilite le suivi du nombre de fois que le with_index(1) est with_index(1) au bloc, simulant efficacement l’utilisation de $. mais honorer le travail de CSV lors de la lecture des lignes supplémentaires nécessaires pour traiter les fins de ligne:

 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 

Qui, lorsqu’il est exécuté, produit:

 $ 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" 

Voici une solution alternative:

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

Pas une solution propre mais simple

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