IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Renommer des fichiers .jpg d'après une liste en désordre (avec concordance) [AppleScript]


Sujet :

AppleScript

  1. #1
    Candidat au Club
    Homme Profil pro
    E-commerçant
    Inscrit en
    Mars 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : E-commerçant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Renommer des fichiers .jpg d'après une liste en désordre (avec concordance)
    Bonjour à tous,

    Après plusieurs heures de recherche et de modifications vaines de certains scripts, je me permets de faire appel aux experts de ce forum (je pense notamment à PBELL, mais les autres experts sont aussi les bienvenus ) :


    Je possède dans un dossier des photos produits nommées "REFERENCEA-1_1000X1000.jpg", "REFERENCEA-2_1000X1000.jpg", [..], "REFERENCEB-1_1000X1000.jpg".

    Je possède dans un tableur, les données organisées comme ceci :

    Référence Désignation
    REFERENCEA Super sabre laser
    REFERENCEB Voiture ultra rapide


    À noter que les références peuvent être n'importe quoi, une suite de chiffres et/ou de lettres.
    Chaque référence peut avoir plusieurs photos produits associés "-1" , [..], "-12", ou une seule photo (absence de "-X")

    Le script idéal pourrait :

    • Supprimer la chaine "_1000X1000" (facile depuis le finder, mais en Applescript je n'en ai aucune idée) ;
    • Rechercher s'il existe ou non une désignation correspondante à la référence traitée ;
    • Remplacer la partie "référence" du nom de fichier par sa "désignation" (en bonus : formatée pour le web).
    • Placer les résultats dans un dossier à part.




    Ce qui donnerait :

    Au départ

    "REFERENCEA-1_1000X1000.jpg" et "REFERENCEA-2_1000X1000.jpg"
    "REFERENCEB-1_1000X1000.jpg" et "REFERENCEB-2_1000X1000.jpg" et "REFERENCEB-3_1000X1000.jpg"

    Référence Désignation
    REFERENCEA Super épée laser
    REFERENCEB Voiture ultra rapide


    Finalement

    "super_epee_laser-1.jpg" / "super_epee_laser-2.jpg"
    "voiture_ultra_rapide-1.jpg" / "voiture_ultra_rapide-2.jpg" / "voiture_ultra_rapide-3.jpg"

    Merci d'avance de votre aide !

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Etant cité, je me sens obligé de répondre !!

    Voici ci-dessous le script demandé et commenté (et testé bien sûr) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    global RefListe, DesListe-- variables globales
    
    set Source to (choose folder with prompt "Selection du dossier des images à traiter") as text
    set Destination to (choose folder with prompt "Selection du dossier de destination") as text
    
    
    set Ftext to choose file with prompt "Selection du fichier text contenant réf <tab> désignation"
    -- le forat de fichier doit être : reference <tab> Designation <return>
    
    
    -- construction de la table d'équivalence ref-> Des
    set RefListe to {}
    set DesListe to {}
    set FContent to readFtext
    set LesLignes to every paragraph of FContent
    set AppleScript'stext item delimiters to {ASCII character 9} -- use tab to split columns
    repeat with uneligne in LesLignes
        set T to every text item of uneligne
        if (count of text items of T) = 2 then -- ligne valide car 2 colonnes
            set the end of RefListe to (text item 1 of T)
            set the end of DesListe to (text item 2 of T)
        end if
    end repeat
    
    
    -- passage en revue des fichier du dossier Source
    tell application "Finder" to set FListe to every file of folder Source
    repeat with F in FListe
        tell application "Finder"
            set N to name of F
            set Ext to name extension of F
            set AppleScript'stext item delimiters to {"_"} -- la partie après est supprimée
            set PartRef to text item 1 of N
        end tell
        set I to itemRef(PartRef) -- cherche le numéro dans le liste RefListe
        if I > 0 then -- la correspondance est trouvée : le nouveau nom est
            set AppleScript'stext item delimiters to {"-"} -- pour récupérer l'indice
            if (count of text items of PartRef) = 2 then -- il y a un indice après la référence
                set Indice to "-" & text item 2 of PartRef
            else
                set Indice to ""
            end if
            set NouvNom to item I of DesListe & Indice & "." & Ext
        end if
    -- copie finale en changeant le nom
    do shell script "cp " & (quoted form of POSIX path of (F as string)) & " " & quoted form of (POSIX path of Destination) & quoted form of NouvNom
    end repeat
    
    
    
    
    on itemRef(LRef) -- renvoie le N° de l'item de la liste qui contient LRef au début
        set N0 to 0
        repeat with LI from 1 to count of RefListe
            if (offset of (item LI of RefListe) in LRef) = 1 then
                set N0 to LI
            end if
        end repeat
        return N0
    end itemRef

  3. #3
    Candidat au Club
    Homme Profil pro
    E-commerçant
    Inscrit en
    Mars 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : E-commerçant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse PBELL !

    Mais j'ai presque honte de te dire que je bloque au moment de choisir le fichier, j'ai essayé les formats .numbers, .xls, .csv, mais le script s'arrête là :

    error "La variable readFtext n’est pas définie." number -2753 from "readFtext"
    Que signifie "le format de fichier doit être : reference <tab> Designation <return>" ?

    Les mots "<tab>" et "<return>" doivent-ils apparaître dans le fichier où s'agit-il de symboles ?

    Argh c'est frustrant de ne rien y comprendre

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Effectivement, j'ai oublié de préciser : dans Excel tu demandes enregistré sous... et tu choisis le format 'tab delimited text' ou 'text délimité", dont l'extension sera '.txt'.
    Ce type de fichier doit s'ouvrir aussi avec TextEdit.

    Il est aussi possible d'ouvrir un fichier vierge avec TextEdit, de le mettre en format text simple (menu Format / Convertir au format texte)
    Ensuite tu dois faire un copié / collé de Excel vers ce fichier texte. Enfin, tu enregistres le fichier (toujours avec l'extension txt).

    Cordialement

  5. #5
    Candidat au Club
    Homme Profil pro
    E-commerçant
    Inscrit en
    Mars 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : E-commerçant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Après avoir enregistré la liste dans un fichier texte avec Excel au format "référence <tab> désignation <return>", même erreur.

    J'ai donc créer un fichier texte (dont l'extension est .txt) via TextEdit :

    référence désignation
    87230002A Kit de 7 outils pour modélisme - Noir
    87230002B Kit de 7 outils pour modélisme - Bleu

    Il y a bien le <tab> qui se crée, et le <return> bah.. le retour à la ligne (j'ai compris ! )

    Mais même erreur

  6. #6
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Citation Envoyé par MartiBoti Voir le message
    Mais même erreur
    Bonjour,
    Pour que je puisse t'aider, il faudrait que tu m'indiques de quelle erreur il s'agit et à quel endroit elle se produit.
    Le script fonctionne chez moi, donc je soupçonne un problème dans ton fichier texte.

    Par exemple, tu peux, dans l'éditeur de script, ajouter des lignes : log "trace N° X" avec X=1, 2,...
    Dans l'éditeur, lors de l'exécution du script, si tu as pris la précaution de demander à voir la partie basse de la fenêtre avec les évènements, tu pourras ainsi voir ce que le script a fait, pas fait, donc où il a planté.

    Enfin, à titre d'exemple, voici en pièce jointe l'exemple de fichier texte que j'ai utilisé pour mes tests.
    Cordialement
    Fichiers attachés Fichiers attachés

  7. #7
    Candidat au Club
    Homme Profil pro
    E-commerçant
    Inscrit en
    Mars 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : E-commerçant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Ah oui désolé il s'agit en fait de la même erreur qu'au départ :

    error "La variable readFtext n’est pas définie." number -2753 from "readFtext"
    Soit la septième ligne.

    Elle apparaît également avec ton fichier.

    Voici un exemple qui reprend tout à petite échelle, le dossier avec les fichiers source, le dossier de destination et le script, peut-être que l'erreur apparaitra chez toi :

    nvelle_importation.zip

    Merci d'avance

  8. #8
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Arrrggg !!!
    il s'agit tout simplement d'un espace qui s'est perdu en ligne 14 lors du copié/collé du script sur ce site.
    Cela arrive parfois et ce, malgré mes vérifications en prévisualisation de mes réponses.

    Il faut rajouter un espace entre "read" (l'instruction) et "Ftext" (la variable) sur la ligne 14 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set FContent to read Ftext
    Sinon, le script cherche la variable "ReadFtext" qui, comme il te l'indique, n'est pas connue.

    Je viens de relire le script de ma réponse avec soin et je n'ai pas trouvé d'autres espaces manquants.

  9. #9
    Candidat au Club
    Homme Profil pro
    E-commerçant
    Inscrit en
    Mars 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : E-commerçant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Waouh impressionnant ! Bon le script plante, mais de voir déjà quelques images être renommées c'est top cool !

    • Le script s'arrête sur la 44ème image :

      error "cp: /Users/UTILISATEUR/Documents/PRIVE/Nouvelle importation/Test/BIDULE - Coque hybride reenforceée à fixation mainétique - APP/APP.jpg.jpg: No such file or directory" number 1
      En surlignant cette ligne :

      -- copie finale en changeant le nom
      do shell script "cp " & (quoted form of POSIX path of (F as string)) & " " & quoted form of (POSIX path of Destination) & quoted form of NouvNom
      Mais j'ai trouvé ! (histoire de ne pas avoir l'air complètement mauvais)

      Le script interprète les slash "/" comme des chemins d'accès.

      Mais comme les noms de fichiers seront "nettoyés" de leurs caractères spéciaux, le problème n'arrivera plus.


    • N'existe-t-il pas d'ailleurs un script permettant de remplacer les espaces et les caractères spéciaux par des underscore "_", de supprimer les accents tout en évitant les triple underscore ?
      (OBJET/OPTION / COULEUR = OBJET_OPTION___COULEUR)
      J'ai trouvé ça, qu'en penses-tu ? Est-il possible de l'intégrer au script ?
    • Concernant l'extension qui est répétée "NOM.jpg.jpg", si c'est trop compliqué je peux supprimer l'extension par lot depuis le Finder avant de lancer le script.


    En attendant un énorme merci pour ce que tu fais !

  10. #10
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,

    Effectivement, on ne le répétera jamais assez, il faut éviter les caractères spéciaux dans les noms de fichiers.
    D'une part ces caractères peuvent être différents entre Mac et Windows ou Linux, d'autre part, surtout pour des photos qui sont appelées à durer longtemps, on ne connaît pas quelles seront les limitations des systèmes futurs !

    Pour ce qui est des doubles extensions '.jpg.jpg', effectivement le script doit planter car ce cas n'est pas prévu. un petit nettoyage sur le Finder s'impose.


    Pour ce qui est des '/', il faut faire une boucle séparée et la lancer séparément, avant. J'essaie de te préparer ce petit script ce soir, entre 2 travaux.

    Cordialement

  11. #11
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Comme promis, voici le petit script de nettoyage des noms de fichiers à lancer avant le script principal.

    La liste de la variable Charincorrect doit contenir les caractères que tu souhaites remplacer.
    Si tu as des caractères qui ne peuvent être inscrits directement, il faut les ajouter avec des 'ascii cataractes xx' (xx étant le code du caractère).
    Par exemple, le compilateur de script ne peut compiler correctement lorsqu'il rencontre un antislash '\', il faut donc le remplacer par un 'ascii character 92'

    La variable NewChar contient une liste avec le caractère de substitution : le '_'.

    Le script remplace tous les caractères de Charincorrect dans le nom de chaque fichier du dossier Source, par le caractère '_' .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    set Source to (choose folder with prompt "Selection du dossier des fichiers à traiter") as text
    
    set Charincorrect to {"/", "@", "-", "!", "'", ",", "(", ")", "*"} -- liste des caractères à remplacer 
    set NewChar to {"_"} -- caractère de remplacement
    
    
    -- passage en revue des fichiers du dossier Source
    tell application "Finder"
        set FListe to every file of folder Source
        repeat with F in FListe
            set N to name of F
            log "n=" & N
            set Ext to name extension of F
            set AppleScript'stext item delimiters to Charincorrect
            set NItems to every text item of N
            set AppleScript'stext item delimiters to NewChar
            set NouvNom to NItems as string
            set name of F to NouvNom
        end repeat
    end tell
    Cordialement

  12. #12
    Candidat au Club
    Homme Profil pro
    E-commerçant
    Inscrit en
    Mars 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : E-commerçant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut MERCI !
    Bonsoir PBELL,

    Tu es incroyable d'efficacité !

    Toutefois si je peux me permettre, comment d'abord nettoyer les noms des fichiers qui ne seront crées qu'après le lancement du script principal ?

    Non mais ça ira comme ça, je ne veux pas abuser, je vais nettoyer les lignes du fichier texte avec des copier-coller successifs dans les outils de Unit Conversion.

    Ce que tu as fait est déjà exceptionnel, merci de ton aide encore une fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. copier des fichiers a partir d'une liste
    Par NicaeaCivitas dans le forum Windows
    Réponses: 2
    Dernier message: 11/07/2017, 15h23
  2. Renommer des fichiers en masse à partir d'une liste excel
    Par sophia1989 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 11/11/2015, 12h38
  3. [XL-2010] Macro pour renommer des fichiers à partir d'une liste de nom de fichiers
    Par thomahh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/01/2013, 17h03
  4. Gestion des lignes vides avant/après une liste
    Par 84mickael dans le forum Mise en forme
    Réponses: 4
    Dernier message: 28/08/2007, 16h25
  5. Réponses: 2
    Dernier message: 13/01/2007, 23h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo