Go to Hackademy website

Vos scripts ruby avec ARGF

Martin Catty

Posté par Martin Catty dans les catégories back

Remplacer le classique ARGV

À l’écriture d’un script ruby on a tendance à utiliser ARGV, pour lire les paramètres entrants.

Généralement cela représente le chemin d’un fichier.

Admettons que je veuille un script tout simple qui rajoute le numéro de chaque ligne:

File.open(ARGV.shift) do |f|
  f.each_line do |line|
    puts "#{f.lineno}: #{line}"
  end
end

Un appel type ./pipe.rb datas.csv fonctionne très bien mais comment faire en sorte que mon script soit réutilisable et que je puisse lui passer du contenu en entrée type:

$ echo "foo,bar\nbaz,coin" | ./pipe.rb
./pipe.rb:4:in `initialize': can't convert nil into String (TypeError)

Nous avons besoin que notre script suive les principes UNIX et puisse être utilisé avec des pipes, en sortie ou en entrée.

Pour cela nous avons à disposition ARGF. ARGF se comporte comme un flux qui est capable d’utiliser l’entrée standard (STDIN) ou un fichier. Notre script va donc se transformer en:

while file = ARGF.gets
  file.each_line do |line|
    puts "#{ARGF.lineno}: #{line}"
  end
end

La sortie (STDOUT) de echo va directement venir alimenter l’entrée de notre script ruby (STDIN) avec le résultat suivant:

echo "foo,bar\nbaz,coin" | ./pipe.rb
1: foo,bar
2: baz,coin

À noter que cela fonctionne également avec un tail -f, exemple:

$ tail -f feed.csv | ./pipe.rb
$ echo "foo,bar\nbaz,coin" > feed.csv
1: foo,bar
2: baz,coin

De la même façon la sortie de notre script peut être réutilisée dans l’entrée d’un utilitaire GNU.

cat datas.csv | ./pipe.rb | grep 'Synbioz' > results

J’espère que ces quelques lignes de Ruby (5!) vous permettrons d’agrémenter vos scripts.

Si vous avez d’autres astuces / bonnes pratiques à partager, n’hésitez pas.

L’équipe Synbioz.

Libres d’être ensemble.

Articles connexes

Une brève histoire d'Elixir et Erlang/OTP

31/01/2019

Je développe depuis plusieurs années en Ruby. Depuis mon arrivée chez Synbioz, j’expérimente en plus avec Elixir de façon assez naturelle. En quoi Elixir est-il différent, me demanderez-vous ? Pour...

Écrire une thread pool en Ruby

10/01/2019

Pouvoir exécuter plusieurs tâches en parallèle, que ce soit dans un script ou une application, peut être vraiment très utile, surtout dans le cas où le traitement de ces tâches peut être très long....

Translation temporelle

31/05/2018

Cette semaine, je me suis essayé à un nouveau format d’article qui se présente sous la forme d’une nouvelle de Science-Fiction. Je tiens en passant à remercier Valentin pour ses illustrations....

Authentifier l'accès à vos ressources avec Dragonfly

11/05/2017

Pour ceux qui ne connaissent pas Dragonfly, c’est une application Rack qui peut être utilisée seule ou via un middleware. Le fait que ce soit une application Rack la rend compatible avec toutes les...