lundi 9 juin 2008

Enlever les accents d'un fichier

Après la pause pour vous parler de Ruby on rails, revenons sur notre thème principal.
Dans les interpréteurs de commande par exemple, les accents sont mal interprétés. Pour une meilleure lisibilité, il est alors intéressant d'avoir un fichier sans accent.
Le langage ruby intègre les expressions régulières. Celles-ci ont pour objectif de filtrer des données (chaînes de caractères). Elles s'apparentent à un Rechercher/Remplacer. Ce sont des fonctionnalités très puissantes mais à la syntaxe parfois ésotérique.
Dans notre programme qui enlève les accents, nous allons simplement utiliser la méthode gsub qui effectue les remplacements.
Voici le programme :

#Utilisateur doit taper un nom de fichier
#Tant que ce n'est pas un fichier, on réitère la demande
nomtape=""
while (!File.file?(nomtape))
puts "Entrer le chemin vers un nom du fichier"
nomtape=gets.chomp
$nomfichier=nomtape
end


#Si l'utilisateur le souhaite, le fichier est d'abord copié avant d'être modifié
#Si vous utilisez Unix, changer la ligne de commande `copy #{$nomfichier} #{$nomfichier}.save` en `cp #{$nomfichier} #{$nomfichier}.save`
rep=""
while(rep!="O" && rep!="N")
puts "Voulez-vous sauvegarder le fichier avant de le modifier (O/N)?"
rep=gets.chomp
end
if(rep=="O")
`copy #{$nomfichier} #{$nomfichier}.save`
puts "Creation de #{$nomfichier}.save"
end


#On affiche le contenu du fichier ligne par ligne avec le numéro de la ligne :
mon_fichier = File.open($nomfichier, "r")
i = 0
fichier=[]
mon_fichier.each_line { |ligne|
fichier[i]=ligne
i += 1
}
mon_fichier.close

#Utilisation d'un table associative (hash). C'est une collection d'éléments accessibles au moyen d'une clé. 'á', 'à' et 'â' sont ici des clés qui permettent d'accéder à 'a'
#gsub : effectue les remplacements
accents = { ['á','à','â','ä','ã'] => 'a',
['Ã','Ä','Â','À','Á'] => 'A',
['é','è','ê','ë'] => 'e',
['Ë','É','È','Ê'] => 'E',
['í','ì','î','ï'] => 'i',
['Í','Î','Ì','Ï']=> 'I',
['ó','ò','ô','ö','õ'] => 'o',
['Ó','Õ','Ö','Ô','Ò'] => 'O',
['œ'] => 'oe',
['Œ'] => 'OE',
['ß'] => 'ss',
['æ']=> 'ae',
['Æ']=> 'Æ',
['ú','ù','u','ü'] => 'u',
['Ü','Û','Ù','Ú'] => 'U',
['ç'] => 'c',
['Ç']=> 'C'
}
accents.each do |ac,rep|
ac.each { |s|
j=0
fichier.each { |elem|
fichier[j]=fichier[j].gsub(s, rep) #remplace s par rep, le cas échéant
j += 1
}
}
end

fichiermodif = File.open($nomfichier, "w")
fichier.each { |element|
fichiermodif.puts element
}

fichiermodif.close

puts "Modification de #{$nomfichier}"


source : http://www.ruby-forum.com/topic/144612#640711

Aucun commentaire: