• Ce blog — désormais archivé — est en lecture seule.

Connaissiez-vous … REPLACE en SQL ?

Sur un projet, j’ai laissé le client télécharger librement ses photos sur l’application. Ce qui a été ennuyeux c’est lorsque je me suis aperçu que les noms de fichiers étaient plutôt très exotiques. Des majuscules en passant par les accents et les apostrophes, c’était très varié. Le problème qui s’est posé c’est lorsque je me suis rendu compte que la solution open-source que j’ai mise en place ne gérait pas correctement ces caractères spéciaux.

J’ai dû trouver une solution rapide pour remplacer tous ces noms de fichiers défaillants (plus de 3000 références). Après une brève recherche je suis tombé sur la fonction MySQL REPLACE() (man).

Très pratique, cette fonction permet de remplacer un motif par un autre dans un champs à spécifier :

REPLACE([field_name],'[string_to_find]','[string_to_replace]')

J’ai ainsi pu récupérer des noms de fichiers corrects dans la base de données.

 

Ceci fait, j’ai écrit un bout de script-shell pour changer les noms de fichiers dans le répertoire d’upload. Pour remplacer les caractères dans le nom du fichier j’ai utilisé la commande TR qui, avec l’option -d, permet de supprimer les caractères fournis dans l’ensemble donné en argument. Sans option, la commande s’attend à recevoir deux ensembles : le premier avec les motifs à remplacer, le second avec les nouveaux motifs.

#!/bin/bash

# Compteur
i=0

# Sauvegarde puis changement du separateur
SAVEIFS=$IFS
IFS=$(echo -en "nb")

# Parcours de tous les fichiers du repertoire courant
for f in `ls`
do
  # Creation du nouveau nom sans accents ni apostrophes
  tmp=`echo "$f" | tr "éèàô" "eeao" | tr -d "'"`

  # Si le nouveau nom du fichier est different de l'original
  # on renomme ce fichier
  if [ "$tmp" != "$f" ]
  then
    mv "$f" "$tmp"
    i=`expr $i + 1`
  fi
done

# Affichage du nombre de modifications faites
echo "$i modifications effectuees"
# On remet le separateur original en place
IFS=$SAVEIFS
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz

Related Posts

Cet article a été publié dans Ancien blog avec les mots-clefs : , , , . Bookmarker le permalien. Les commentaires et les trackbacks sont fermés.