IPB

Bienvenue invité ( Connexion | Inscription )

> Modifier une donnée EXIF en applescript, La valeur à écrire est à lire dans un fichier excel
Options
Speed Moock
posté 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Réponse(s)
PBell
posté 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
Go to the top of the page
 
+Quote Post
yponomeute
posté 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



Citation (PBell @ 31 Oct 2016, 08:18) *
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
Go to the top of the page
 
+Quote Post

Les messages de ce sujet
- Speed Moock   Modifier une donnée EXIF en applescript   27 Oct 2016, 18:04
- - Jaypee   Speed Moock, Au lieu d'empiler plusieurs outi...   28 Oct 2016, 13:26
- - Speed Moock   Bonjour Jaypee, Merci pour la proposition mais d�...   28 Oct 2016, 13:38
- - Jaypee   Pas de problème, Speed Moock. Si un outil est une...   29 Oct 2016, 08:19
- - hellomorld   C'est assez simple à faire avec Livecode (htt...   29 Oct 2016, 09:11
- - Jaypee   A mon avis on peut se passer de EXIFtools Il y ...   29 Oct 2016, 13:02
- - Speed Moock   Merci à tous ! Je vais profiter du long WE p...   29 Oct 2016, 18:05
- - PBell   QUOTE (Speed Moock @ 27 Oct 2016, 19:04) ...   29 Oct 2016, 18:53
- - Jaypee   L'un des scripts de la documentation de ...   29 Oct 2016, 19:47
- - Speed Moock   Bonjour à tous En lisant le post de Pbell je vie...   30 Oct 2016, 00:23
- - PBell   Bonjour, Merci pour la précision quant aux taille...   30 Oct 2016, 07:22
- - Jaypee   Une recommandation de haut niveau. Ce traitement ...   30 Oct 2016, 10:08
- - Speed Moock   Bonjour, Pour répondre à Pbell : Le nombre d...   30 Oct 2016, 15:57
- - Jaypee   Je complète mon exemple avec un parcours d'ar...   30 Oct 2016, 17:21
- - Zeltron54   Bonsoir, Tu peux aussi mettre ton information dan...   30 Oct 2016, 20:14
- - Jaypee   @Zeltron54, Le champ Commentaires ne semble pas i...   30 Oct 2016, 21:45
- - Speed Moock   Merci Zeltron pour cette proposition, mais je l...   30 Oct 2016, 21:46
- - PBell   Bonjour, Effectivement les seuls champs qui peuven...   31 Oct 2016, 08:18
|- - yponomeute   Citation (PBell @ 31 Oct 2016, 08:18) 1) ...   2 Nov 2016, 08:38
- - Speed Moock   Salut Merci Pbell Toujours clair et concis merci ...   31 Oct 2016, 08:51
- - Jaypee   Juste une petite remarque à propos d'EXIFtool...   31 Oct 2016, 09:53
- - PBell   Bonsoir Jaypee, Je ne connaissais pas l'applic...   31 Oct 2016, 19:09
- - Jaypee   Merci à tous également... Un simple sujet comme ...   1 Nov 2016, 09:09
- - Speed Moock   Bonjour à tous, J'ai testé sur un dossier c...   1 Nov 2016, 10:10
- - Jaypee   Je recommande très vivement de créer une petite ...   1 Nov 2016, 16:43
- - Speed Moock   Ah oui quand même... Bon je vais me creuser la t...   1 Nov 2016, 21:49
- - PBell   Bonsoir, Comme l'a justement indiqué Jaypee, ...   1 Nov 2016, 23:24
- - Speed Moock   Merci Pbell ! Je teste ceci demain en environn...   1 Nov 2016, 23:43
- - Jaypee   Speed Moock, Vu la tournure que prend les choses, ...   2 Nov 2016, 07:15
- - PBell   Merci Jaypee, Je suis assez d'accord avec toi....   2 Nov 2016, 08:21
- - Jaypee   @PBell Il faut raisonner "Inversion de contro...   2 Nov 2016, 13:02
- - Jaypee   @yponomeute @PBell Une fois qu'on a le script...   2 Nov 2016, 13:17
- - PBell   Bonsoir Jaypee, Merci de ton aide...j'ai encor...   2 Nov 2016, 19:53
- - Jaypee   @PBell, oublie la boucle, et penche-toi sur la com...   2 Nov 2016, 21:52
- - teddy7545   Speed Moock Le problème de fond et les discussio...   3 Nov 2016, 03:57
- - Speed Moock   Bonjour TEddy7545 Le sujet m'échappe complè...   3 Nov 2016, 07:38
- - Jaypee   Speed Moock, J'entends ton souhait. Je vais ...   3 Nov 2016, 11:47
- - Speed Moock   Bonjour Jaypee, - l'index est un identifiant u...   3 Nov 2016, 13:36
- - PBell   Bonsoir Teddy7545, Grâce à tes conseils, je croi...   3 Nov 2016, 19:09
- - Speed Moock   Bonsoir, Une question sur la commande do shell s...   3 Nov 2016, 21:09
- - PBell   Bonsoir SpeedMoock, Il faut mettre tous les champs...   3 Nov 2016, 21:37
- - Jaypee   Je suis en train de faire un timing grandeur natur...   3 Nov 2016, 21:46
- - teddy7545   Bonsoir, Désolé Speed Moock, j'avais en eff...   4 Nov 2016, 02:49
- - Jaypee   Une note en forme de conclusion sur les performanc...   4 Nov 2016, 06:48
- - PBell   Grand merci à Teddy7545 : mon script fonctionne g...   4 Nov 2016, 15:46
- - Jaypee   @PBell Apparemment, awk se comporte aussi naturel...   5 Nov 2016, 07:44


Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 20th May 2024 - 11:27