Causeries numériques

Aller au contenu | Aller au menu | Aller à la recherche

mardi 11 novembre 2008

Un autre uniligne en Ruby

Renommer les fichiers qui composent un répertoire et souvent une galère à la main. J'ai un script qui me permet de le faire, mais je voulais voir si on pouvait le faire en une ligne de Ruby, la réponse est là :

ruby -e 'Dir.glob("*.txt").each{ |f| File.rename(f,f.gsub(/^(\d\d) /,%q[\1 - ]))}

L'option -e permet de faire exécuter la chaîne de caractères par l'interpréteur ruby. Pour éviter que bash n'interprète les instructions on les places entre apostrophes (ça permet de garder les guillemets pour la suite du programme).

  1. La méthode glob de la classe Dir liste tous les fichiers correspondant au motif placé en argument (ici, tous les fichiers en .txt)
  2. Un bloc est utilisé avec la méthode each, ce bloc est délimité par les accolades, la variable f prendra le nom d'un des fichiers à chaque itération.
  3. La méthode rename de la classe File est utilisée pour renommer le fichier.
  4. Le nouveau nom du fichier est construit à partir d'un expression régulière avec la méthode gsub. Les apostrophes ne pouvant pas être utilisés, on est obligé de passer par une notation %q[...]

Pour éviter de planter des fichiers, il est judicieux de tester la regexp avec un puts :

ruby -e 'Dir.glob("*.txt").each{ |f| puts f+"->"+f.gsub(/^(\d\d) /,%q[\1 - ])}'

edit du 13/11 glob peut être remplacé par [...]

ruby -e 'Dir["*.txt"].each{ |f| puts f+"->"+f.gsub(/^(\d\d) /,%q[\1 - ])}'

c'est valable pour le puts ou pour le File.rename.

lundi 20 octobre 2008

Uniligne en Ruby

Mes listings d'étudiants me sont fournis au format suivant

...
DUPONT,PAUL
DURAND,PIERRE
...

La présentation "tout en majuscules" ne me plaît pas beaucoup ; je préfère une majuscule en début de nom et en début de prénom. Plutôt que m'amuser à tout faire à la main, j'ai écrit un petit uniligne qui fait tout d'un coup.

Pour obtenir un comportement uniligne en ruby, on utilise plusieurs options sur la ligne de commande (l'option -e est obligatoire). Les principales options sont les suivantes :

  • -e permet de créer un uniligne, en spécifiant les instructions depuis la ligne de commande (les instructions sont placées entre apostrophes pour éviter que le shell ne les interprète).
  • -n Ruby place les instructions dans une boucle (while gets ... end) en utilisant le fichier (dont le nom et placé en argument sur la ligne de commande) comme source.
  • -p est identique à -n avec en plus un affichage de $_ (la ligne lue) à la fin de la boucle.

L'uniligne obtenue est le suivant :

ruby -ne 'puts $_.split(",").each{|n| n.capitalize!}.join(",") ' TD.csv > TDmaj.csv

La ligne lue (dans le fichier TD.csv) est découpée en utilisant split puis une boucle each permet de traiter chaque élément avec capitalize! pour passer que la première lettre en majuscule. Le contenu du tableau (issue du each) et transformé en une chaîne en utilisant join avec la virgule comme caractère de jointure. Une redirection finale (> TDmaj.csv) envoie tout ça dans un nouveau fichier.

mardi 23 septembre 2008

Le lien du développeur

Le site gotAPI regroupe la majorité des API des langages usuels. Le site est pratique et paramétrable via des onglets pour choisir les langages qu'on utilisent. L'intérêt de la manip' c'est qu'on ne garde qu'un onglet sous Firefox, ça évite d'avoir une douzaine d'onglets d'ouverts quand on travaille sur plusieurs langages en même temps.

mercredi 13 juin 2007

Manipulation de tags mp3 avec Perl, Ruby et Python

Pour les petits scripts de quelques lignes, trois langages se partagent le terrain : Perl, Python et Ruby. Le problème du jour est la modification de tags ID3 ainsi que le renomage de fichiers.

Lire la suite...