Modifier une donnée EXIF en applescript, La valeur à écrire est à lire dans un fichier excel |
Bienvenue invité ( Connexion | Inscription )
Modifier une donnée EXIF en applescript, La valeur à écrire est à lire dans un fichier excel |
27 Oct 2016, 18:04
Message
#1
|
|
Adepte de Macbidouille Groupe : Membres Messages : 42 Inscrit : 30 Aug 2016 Membre no 199 619 |
Bonjour à tous,
Voici ce que je souhaite faire : Je dispose de dossiers et sous dossiers contenant des images dont le nom est structuré ainsi : racine fixe égale à G_ puis code produit en 6 caractères séparateur fixe _ puis code couleur sur 2 à 4 caractères séparateur fixe _ZP_ Index d'image valeur 1 à 10 séparateur fixe _ Code interne unique sur 6 caractères Exemple G_12345_320_ZP_1_565656.jpg est l'image numéro 1 du produit 12345 En parallèle je dispose d'un énorme listing excel composé en colonne A des codes produits et en colonne B de la taille de ces produit (champ texte) Je cherche à réaliser un script qui pour chaque image va chercher si elle en trouve la taille dans le listing et si oui écrira dans une donnée EXIF la valeur du champ texte. Si le code produit n'est pas dans le listing, ne rien écrire. le script demande donc de la récursivité et l'utilisation de EXIFTOOL (que j'ai téléchargé et installé mais sans savoir faire mieux...) Avez-vous des idées ? Merci |
|
|
31 Oct 2016, 08:18
Message
#2
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 265 Inscrit : 7 Dec 2013 Lieu : Ile de France Membre no 188 169 |
Bonjour,
Effectivement les seuls champs qui peuvent être utilisé avec des images, tant sur Mac que sur Windows doivent être des champs EXIF ou IPTC. Les autres champs ne seront pas transférés d'un OS à l'autre (dommage que Microsoft n'ai pas aussi copié cette partie lorsqu'il a crée Windows). Commençons par le language : nous avons jusqu'à 30 000 lignes dans le fichier Excel et sans doute autant de fichiers image. Donc la meilleure solution semble être un script shell Unix en terme de vitesse. Cependant, j'ai préféré un script Applescript avec des appels Unix pour 2 raisons: 1) il faut commencer par demander à l'utilisateur le nom du dossier racine et du fichier Excel : c'est facile en AS. mais je ne pense pas que cela soit possible en shell Unix 2) J'ai des lacunes en shell qui ne me permettent pas d'assurer un script qui fonctionne. Mais les autres contributeurs pourront aussi traduire en shell La demande pose 3 problèmes: - récursivité dans l'arborescence des dossier et sous dossiers - recherche rapide, à partir du produit, dans le fichier Excel, pour trouver la colonne B content un texte - ajout de ce texte dans l'image elle-même (EXIF) Récursivité: La solution que j'ai retenue fonctionne, mais sera sans doute longue (peut être trop longue) sur 30000 fichier. Inutile de dire que je n'ai pas tester sur ce nombre, mais sur environ 200 images. C'est le point critique de performance. Je me suis basé sur la fonction "entire content" qui extrait tous les fichiers situés dans une arborescence. Si elle a le mérite d'être simple, ce n'est pas performant et j'ai de grands doutes sur 30 000 fichiers. Il sera sans doute utile de lancer le script plusieurs fois sur des dossiers de niveaux inférieurs pour se limiter à environ 1000 à 2000 images à chaque fois. Si cela pose un problème, dis le, et je ré-écrirai cette partie en vrai récursivité. Il reste que 30 000 en un seul coup risque d'être très long. Recherche rapide du produit dans le liste Excel: Là, je me suis dis "facile !", mais c'est en fait là où j'ai passé le plus de temps. La fonction la plus rapide est une commande shell Unix 'grep'. 'Grep xxx yyy' est capable de trouver la ligne contenant xxx dans le fichier yay... Oui, mais qu'est-ce qu'une ligne ? En fait, grep considère, comme beaucoup de logiciels, qu'un ligne est un ensemble de caractères se terminant par le caractère spécial linefeed (LF ascii=10). Oui mais... Excel en text tabdelimiter, en cdv, en UTF text,... ne mets pas ces fameux linefeed, mais des Carriage Return (CR ascii=13) ! donc pour grep, tout le fichier n'est qu'une ligne !!! En analysant les différents format de sortie Excel, la solution est de sauvegarder ton fichier Excel en format "Windows fomatted text": là les fin de lignes sont faites avec le CR et le LF ! Du coup le grep fonctionne parfaitement. Dans ce format de sortie Excel, la séparation entre les colonne se fait par une tabulation (ascii=9). Pour les curieux, j'ai ajouté un '^' qui signifie que ce que je cherche doit être en début de ligne (au cas où la colonne B contienne des chiffres comme un code produit !) Ajout du texte dans l'image: Pas de doute ici, l'instruction à utiliser est le exiftool. Reste à savoir quel tag doit être utilisé. J'ai choisi 'imageDescription' car c'est une partie de l'EXIF standard et donc cela aura plus de chance d'être lu par de nombreux logiciels. Voici le script résultant : (testé bien sûr) CODE set DosParent to choose folder "Sélectionner le dossier parent contenant les images à traiter" set WFormatted to choose file "Sélectionner le fichier Windows formated contenant les dimensions" set WPath to quoted form of (POSIX path of WFormatted) set AppleScript's text item delimiters to {"_"} set tab to ASCII character 9 tell application "Finder" to set MesImages to every file in entire contents of DosParent whose name starts with "G_" repeat with uneImage in MesImages tell application "Finder" to set Produit to text item 2 of ((name of uneImage) as string) set R to "" try set R to do shell script "grep ^" & Produit & " " & WPath on error set R to "" end try if R is not "" then set DimText to text ((offset of tab in R) + 1) thru -1 of R set UnixPath to POSIX path of (uneImage as string) do shell script "/usr/local/bin/exiftool -ImageDescription='" & DimText & "' -Overwrite_Original " & quoted form of (UnixPath) end if end repeat Après traitement, tu pourra vérifier dans Aperçu, sur une image traitée, dans la fenêtre inspecteur, onglet IPTC, l'image description contenant ta colonne B. Cordialement -------------------- iiMac 24 M1 16Go/1To 13.5.1
iMac 27 i5 3,1GHz 8Go/1To 10.11.6 / 10.6.8 iMac 20 C.Duo 2,6Ghz 8Go/350Go 10.6.8 / 10.11 Mini C.Duo 2,0Ghz 2Go/500Go 10.6.8 |
|
|
2 Nov 2016, 08:38
Message
#3
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 Inscrit : 26 Jan 2011 Lieu : Pollachius virens Membre no 164 083 |
1) il faut commencer par demander à l'utilisateur le nom du dossier racine et du fichier Excel : c'est facile en AS. mais je ne pense pas que cela soit possible en shell Unix Il me semble qu'avec platypus c'est possible (à confirmer, cela fait longtemps que je ne l'ai pas utilisé) : http://sveinbjorn.org/platypus D'autre part j'ai déjà eu des traitements sur des dizaines de milliers de fichiers en script shell. J'avais adopté une solution en plusieurs étapes qui fonctionnait bien : au lieu de faire le traitement dans une boucle j'écrivais la ligne de commande à exécuter dans un fichier, et ensuite j'exécutais les lignes du fichier. Par exemple : Code echo "ma ligne de commande shell;" >> liste_commandes.sh et ensuite Code bash liste_commandes.sh En fait j'utilise systématiquement cette technique lorsque je développe un script, cela me permet de ne pas exécuter les commandes en phase de développement et de pouvoir facilement vérifier que script produit bien la bonne commande. -------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
Nous sommes le : 20th May 2024 - 11:27 |