Page 1 sur 1
[R] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 11:19
par cortx
Bonjour;
Je souhaiterai que vous me veniez en aide pour un script de renommage de photo en masse.
Je possède un LG Viewty et il n'ont rien trouvé de mieux que de faire un nommage de photo en jj/mm/aa.
Ce qui fait que dans un même dossier les fichiers sont triés par jours, et donc toute les photos du 05 que ce soit janvier avril ou décembre se suivent, et ensuite vienne les photos du 06 etc etc... Bref pas super pour du tri ou du rangement sur un FTP.
Voici un exemple d'un nom de photo; P120509_09.35
Soit Pjjmmaa_hh.mn (Avec; P une lettre fixe, jj le jour, mm le mois, aa l'année, hh l'heure et mn la minute)
Je souhaiterai que les photos soient renommée comme suit:
Paammjj_hh.mm; donc un décalage dans les lettres entre l'année, le mois et le jour.
Si vous souhaitez supprimer le P du début je n'y voit pas d'inconvénient au contraire, il ne correspond à rien et donc ne sert pas au triage.
Informations supplémentaires;
Si une photo est prise à la même date et à la même minute, voici comme elle sont nommé
P120509_09.35 - Pour la première,
P120509_09.35[01] - Pour la seconde,
P120509_09.35[02] - Pour la troisième,
Et ainsi de suite, Il en résulte qu'une photo n'a pas un nombre fixe de caractère, je ne sais pas si ca vous est utile mais comme ca c'est signalé.
Ce nommage me plait assez, il permet de laisser un ordre, donc dans la mesure du possible j'aimerai qu'il soit gardé.
L'extension des fichiers est en JPG (en majuscule) - Pareil, je ne sais pas si ca vous est utile mais bon.
Si il vous faut des informations supplémentaire, il suffit de demander.
Je vous remercie d'avance pour toute l'aide que vous pourriez m'apporter sur la réalisation d'un tel script.
Bonne journée à vous tous.
CortX
Re: [...] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 11:23
par timmalos
J'avais deja posté un exemple de renommage en masse.
Va voir dans la partie EXEMPLE et cherche

ca peut t'aider pour une grosse partie de ton scrip.
Edit : Bonne poire Aujourd'hui:
http://www.autoitscript.fr/forum/viewto ... f=6&t=1506
Après pour le renommage pur, il va falloir utiliser du RegExpReplace() Bon courage
Re: [...] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 12:05
par cortx
Merci beaucoup, déjà ca me donne la base pour la modification d'un répertoire.
La suis en train de m'éplucher la liste des fonction à la recherche d'une fonction capable de sortir un nombre de lettre à partir d'un champ donnée.
Je passerai tout ca en variable et apres je reconstruirai le nom et le fichier.
Mon idée est sur la bonne voie ou rien à voir du tout j'y arriverai pas comme ca ?
Edit;
J'ai réussi à trier comme je le souhaite les lettres d'un mot donné.
Par contre j'ai énormément de mal à l'intégrer dans le code que tu m'a fournit (récupération du nom du fichier en cours, replacement du nouveau nom et enregistrement de celui ci).
Est ce que quelqu'un pourrait faire l'intégration pour moi s'il vous plait avec le renommage du fichier, car comme on peux le voir dans mon code je suppose, la programmation et moi ca fait deux, et je fait au plus simple pour ma compréhension.
► Afficher le texte
Code : Tout sélectionner
; ; Début du script - Ajouter votre code ci-dessous.
$debut = 0
$combien = 1
$count = 0
$name = "P120509_09.35[02]"
while $count < 7
$count = $count + 1
$debut = $debut + 1
$var = StringMid( $name , $debut, $combien)
If $count = 1 Then
$var21=$var
$var11=$var
else
if $count = 2 Then
$var26=$var
$var12=$var
else
if $count = 3 Then
$var27=$var
$var13=$var
else
if $count = 4 Then
$var24=$var
$var14=$var
else
if $count = 5 Then
$var25=$var
$var15=$var
else
if $count = 6 Then
$var22=$var
$var16=$var
else
if $count = 7 Then
$var23=$var
$var17=$var
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
WEnd
$var1 = $var11&$var12&$var13&$var14&$var15&$var16&$var17
$var2 = $var21&$var22&$var23&$var24&$var25&$var26&$var27
MsgBox(0, "Le nouveau nom est ", $var1 & " " & $var2)
$motfinal = StringReplace($var1,$var1, $var2)
MsgBox(0, "Le nouveau nom est ", $motfinal)
Merci
Re: [...] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 14:06
par 20100
Bon voila comme j'ai pas trop le temps de me pencher sur le StringRegExp, je n'ai pas codé la vérification du nom du fichier afin qu'il respecte bien le pattern que tu nous as donné (Pjjmmaa_hh.mn).
Code : Tout sélectionner
#include <Array.au3>
#Include <File.au3>
Local $directory = "C:\x" ; Repertoire qui contient les images à renommer
Local $jpg_list = _FileListToArray($directory, "*.jpg", 1) ; Selectionne uniquement les fichiers d'extention *.jpg
Local $rename_current
Local $rename_save = ""
If( IsArray($jpg_list) ) Then
For $i=1 To $jpg_list[0] Step 1
; Sauvegarde de l'ancienne nomenclature dans le sous-repertoire "..\savefile_with_oldname"
FileCopy($directory&"\"&$jpg_list[$i], $directory&"\file_with_oldname\",9)
; Vérfication de la nomencalture, ie que le fichier est bien sous la forme "Pjjmmaa_hh.mn.jpg"
; Pas fait... On suppose que les fichiers à renommer soit bien sous cette forme.
$jour = StringMid($jpg_list[$i], 2, 2)
$mois = StringMid($jpg_list[$i], 4, 2)
$annee = StringMid($jpg_list[$i], 6, 2)
$heure = StringMid($jpg_list[$i], 9, 2)
$min = StringMid($jpg_list[$i], 12, 2)
; Ecriture du nouveau nom, on vérifie qu'il n'existe pas déjà
$rename_current = "P_"&$annee&$mois&$jour&"_"&$heure&"."&$min
If( $rename_current = $rename_save ) Then
$rename_current = $rename_current&"_["&$count_string&"]"
$count = $count+1
If( $count < 10 ) Then
$count_string = "0"&$count
Else
$count_string = $count
EndIf
Else
$count = 1
$count_string = "0"&$count
EndIf
$rename_save = "P_"&$annee&$mois&$jour&"_"&$heure&"."&$min
FileMove($directory&"\"&$jpg_list[$i], $directory&"\"&$rename_current&".jpg", 9)
Next
EndIf
Re: [...] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 14:07
par timmalos
ARG que c'est pas beau a voir
Code : Tout sélectionner
If $count = 1 Then
$var21=$var
$var11=$var
else
if $count = 2 Then
$var26=$var
$var12=$var
else
if $count = 3 Then
$var27=$var
$var13=$var
else
if $count = 4 Then
$var24=$var
$var14=$var
else
if $count = 5 Then
$var25=$var
$var15=$var
else
if $count = 6 Then
$var22=$var
$var16=$var
else
if $count = 7 Then
$var23=$var
$var17=$var
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
Peut doit être remplacer par
Code : Tout sélectionner
Switch $count
Case 1
...
Case 2
...
Case 3
...
Case 4
...
Case 5
...
Case 6
...
EndSwitch
Ou encore
Code : Tout sélectionner
If $count = 1 ... Then
ElseIf ... Then
ElseIf ... Then
Else
EndIF
Sinon le code de 20100 est très bien. On pourrait remplacer par un Patten, mais si ca marche...

Re: [...] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 15:02
par cortx
Merci beaucoup 20100.
Ça marche à la perfection, et effectivement le code n'a rien à voir avec le mien
Juste pour mon information, quel est la différence entre mon code à ralonge et le second que propose timmalos
Il y aura toujours le même nombre d'instruction, hormis que j'ai décomposé le elseif non ?
En tout cas, un énorme merci pour tout ca.
Edit: Je me suis permis d'apporter deux modifications.
Retirer le _ après le P
Et ensuite pour s'assurer que les fichier pris en compte soit bien les P* j'ai rajouté cela dans la création de la liste.
Malheureusement les fichiers Photoxx étaient aussi pris en compte donc j'ai mis le _ aussi.
JLocal $jpg_list = _FileListToArray($directory, "P*_*.jpg", 1)
Voila c'était juste pour informations.
Encore mille merci.
Re: [...] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 16:26
par timmalos
Quand un post est résolu, merci de le mettre en éditant votre premier message avec [R]
La seule différence c'est que c'est bien plus propre, et que quand vous voulez que quelqu'un derriere lise votre post, il faut que le code soit propre sinon on aura pas envie et quelque fois on passe au Post suivant

Re: [R] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 17:26
par 20100
Juste pour mon information, quel est la différence entre mon code à ralonge et le second que propose timmalos. Il y aura toujours le même nombre d'instruction, hormis que j'ai décomposé le elseif non ?
Heu le temps du COBOLD ou du Basic est désormais révolue, comme le précise timmalos c'est essentiellement pour la lecture de ton code source. Néanmoins pour faciliter la lecture il vaut mieux utiliser du if, elseif, elseif, else. Sinon une petite remarque il vaut mieux utiliser un
Switch quand c'est possible afin d'améliorer les performances. En effet une structure en
switch est plus performante qu'une structure en
elseif car cette dernière doit testé chacune des conditions les unes après les autres et doit donc évalué chaque condition jusqu'à trouvé une correspondance, ce qui n'est pas le cas d'un switch qui permet une sortie plus rapide...
► Afficher le texte
Code : Tout sélectionner
; Pour ralentir les test effectués dans les boucles conditionnelles
Func _ralentisseur($x)
sleep(100)
return $x
EndFunc
Local $msg1 = "", $msg2 = ""
Local $test = 5
; Test identique avec switch
Local $timer_init = TimerInit()
Switch _ralentisseur($test)
Case 1
$msg1 = "valeur 1"
Case 7
$msg1 = "valeur 7"
Case 3 To 5
$msg1 = "valeur entre 3 et 5"
Case Else
$msg1 = "valeur non défini"
EndSwitch
Local $timer_end1 = TimerDiff($timer_init)
; Test avec structure If, ElseIf
Local $timer_init2 = TimerInit()
If( _ralentisseur($test) = 1) Then
$msg2 = "valeur 1"
Elseif( _ralentisseur($test) = 7) Then
$msg2 = "valeur 7"
Elseif( (_ralentisseur($test)>=3) AND (_ralentisseur($test)<=5) ) Then
$msg2 = "valeur entre 3 et 5"
Else
$msg2 = "valeur non défini"
EndIf
Local $timer_end2 = TimerDiff($timer_init2)
MsgBox(0, "", "Avec switch : timer = "&$timer_end1&" ($msg1 = "&$msg1&")"&@CRLF&@CRLF&"Avec elseif : timer = "&$timer_end2&" ($msg2 = "&$msg2&")")
Avec $test = 1, c'est sensiblement la même chose puisque quelque soit la structure la sortie de boucle se fait en même temps au premier test effectué... mais ce n'est plus le cas pour les autres test...
Re: [R] Renommage en masse par inversion de lettre
Posté : mer. 02 sept. 2009 18:14
par cortx
OK.
Merci.