# Renommer le contenu de fichiers en Applescript / Automator?



## BS0D (13 Décembre 2008)

Bonjour à tous, 

Voilà, j'ai un nombre important de fichiers html et php, dans lesquels je voudrais *changer du contenu automatiquement* car à la main ça prendrait trop de temps. 

Ma question est la suivante: est-il possible de* chercher/remplacer le contenu de ces fichiers avec automator ou en applescript *?
Si oui, avez-vous des indications? 

(ex: remplacer tous les "_BS0D_" par "_Mon Prénom_" à l'intérieur même des fichiers)

Merci de votre aide...


----------



## zacromatafalgar (13 Décembre 2008)

Salut,

C'est possible dans un fichier html avec applescript, je ne peux rien te garantir pour les .php mais je pense qu'ils sont également modifiables


----------



## pascalformac (13 Décembre 2008)

un réglage avancé du freeware quicksilver peut faire ca

(fonction de depistage remplacement de contenu de fichier)


----------



## zacromatafalgar (13 Décembre 2008)

Si tu veux tester le code suivant, il fonctionne chez moi  avec des fichiers html&#8230;

Il te suffit de remplacer les properties en début de script 

```
property textToFind : "test"
property textToWrite : "footer"

on open theDrop
	set nbrItems to count of theDrop
	repeat with thisFile from 1 to nbrItems
		set theFile to (item thisFile of theDrop)
		set fileID to open for access file (theFile as string)
		set dataFromFile to read fileID as string
		close access fileID
		
		
		set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
		
		
		set x to open for access file (theFile as string) with write permission
		write dataToWrite to x
		close access x
	end repeat
end open


on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
```


----------



## BS0D (13 Décembre 2008)

OK merci, je vais voir pour quicksilver (je connaissais pas) et si j'ai un souci je reviens par ici


----------



## BS0D (13 Décembre 2008)

zacromatafalgar a dit:


> Si tu veux tester le code suivant, il fonctionne chez moi  avec des fichiers html
> 
> Il te suffit de remplacer les properties en début de script
> 
> ...



Genial, je vais tester. par contre, ce sont des fichiers php que je dois retoucher... ça va marcher? 

pas le temps de tester tout de suite, mais je te tiens au courant


----------



## zacromatafalgar (13 Décembre 2008)

BS0D a dit:


> Genial, je vais tester. par contre, ce sont des fichiers php que je dois retoucher... ça va marcher?



Je ne sais pas, je n'en ai pas pour tester.
Tu peux essayer sur une copie de fichier


----------



## pascalformac (13 Décembre 2008)

BS0D a dit:


> OK merci, je vais voir pour quicksilver (je connaissais pas) et si j'ai un souci je reviens par ici


ben non 
tu vas dans le long fil dédié à ce freeware
( en passant tutos  pdf dans les dernieres pages)

extrait


> Lastly, heres a cute trick from the *Text Manipulation Actions* plug-in we already talked about. If  you bring up a text file in the object pane, even though there is no > next to it in the results list,  you can still type &#8594; or / to move into the file, like you can with html files.  What you get is a new  results list with one text item for each line in the file. These all show an > next to them but you  cant &#8594; into them further.  However you can choose from any of the normal text actions as well  as a couple more that work on these text line reference objects. The ominously named Delete  Line (UNSTABLE) will remove the line from the file. Yes, youre cautioned about using it.  Less  risky is *Change To.*.. which takes new text in the third pane and will replace the text in the file  with it. In addition, the Prepend Text... and Append Text... actions can work on text line references. Their argument is added as a new line before or after the line respectively. I had a problem with line-endings when using Prepend Text... on the first line in a file.


----------



## BS0D (13 Décembre 2008)

zacromatafalgar a dit:


> Je ne sais pas, je n'en ai pas pour tester.
> Tu peux essayer sur une copie de fichier


 
Je viens d'arriver au taffe, donc je retrouve un bon vieux windaube qui a déjà planté une fois au bout d'un quart d'heure  mwah 
Je testerai donc plus tard



pascalformac a dit:


> ben non
> tu vas dans le long fil dédié à ce freeware
> ( en passant tutos pdf dans les dernieres pages)


 
Merci, il me semble que je vais devoir l'appréhender un peu... du coup d'oeil que j'ai jeté, c'est pas si facile qu'automator. 
On verra ce soir 

Merci les gars


----------



## pascalformac (13 Décembre 2008)

BS0D a dit:


> Merci, il me semble que je vais devoir l'appréhender un peu... du coup d'oeil que j'ai jeté, c'est pas si facile qu'automator.


le quicksilver est un outil très souple c'est ce qui en fait sa qualité et...son défaut
qualité: sert à plein de choses ( recherche , lancement d'appli , manips de fichiers , manips dans fichier) et le tout memorisé
defaut : manuel du developpeur minimaliste
mais plein de gens ont pondu des manuels ou  screencasts 
(ou decouvert des utilisations avancées,  certaines imprévues par le developpeur ! c'est lui qui le dit , ravi)


----------



## grumff (13 Décembre 2008)

Mouaip y'en a des tas des softs capables de faire ça, moi je passe par bbedit ou eclipse en général, sinon en 3 lignes de shell à coup de sed/ls/xargs


----------



## pascalformac (13 Décembre 2008)

exact  même textedit( dans certains cas c'est pas pratique du tout)  ou textwrangler etc etc


----------



## BS0D (13 Décembre 2008)

grumff a dit:


> Mouaip y'en a des tas des softs capables de faire ça, moi je passe par bbedit ou eclipse en général, sinon en 3 lignes de shell à coup de sed/ls/xargs


 


pascalformac a dit:


> exact même textedit( dans certains cas c'est pas pratique du tout) ou textwrangler etc etc


 
Je me doute, mais moi je voudrais automatiser la tâche pour m'embeter le moins possible: à savoir que j'ai des dossiers et sous-dossiers, et 1000 fichiers ou un truc dans le genre. 
L'intérêt c'est donc pas d'ouvrir chaque fichier individuellement pour me taper 100 clic de find&replace par fichier !


----------



## BS0D (13 Décembre 2008)

zacromatafalgar a dit:


> Si tu veux tester le code suivant, il fonctionne chez moi  avec des fichiers html
> 
> Il te suffit de remplacer les properties en début de script
> 
> ...



re-
dis, y'a t-il moyen de coupler ce script avec une action automator style "_ouvrir les éléments du finder indiqués_"? 
parce que ça marche, mais je suis obligé de dropper chaque fichier l'un après l'autre... c'est comme qui dirait pénible ! 


et avec QS, je trouve pas du tout comment faire...


----------



## zacromatafalgar (13 Décembre 2008)

BS0D a dit:


> re-
> dis, y'a t-il moyen de coupler ce script avec une action automator style "_ouvrir les éléments du finder indiqués_"?
> parce que ça marche, mais je suis obligé de dropper chaque fichier l'un après l'autre... c'est comme qui dirait pénible !



J'ai pourtant essayé avec plusieurs fichiers (4) et ça fonctionnait parfaitement, je viens de renouveler le test et ça marche chez moi

Pour Automator, probablement mais je ne l'utilise pas.


----------



## BS0D (13 Décembre 2008)

zacromatafalgar a dit:


> J'ai pourtant essayé avec plusieurs fichiers (4) et ça fonctionnait parfaitement, je viens de renouveler le test et ça marche chez moi&#8230;
> 
> Pour Automator, probablement mais je ne l'utilise pas.



Alors peut etre que je m'y prends mal : j'ai essayé en l'enregistrant en tant qu'application option application executable uniquement et un peu toutes les autres options. 
mais quand je rouvre mes fichiers, le texte à remplacer n'a disparu que dans un des fichiers droppés dessus (c'est bien un dropplet hein?!)

je sais pas si ça vient de ça, mais comme je les avais mis sur le net et que je les ai retéléchargés, mac os me demande confirmation avant de les ouvrir en me disant : 

Voir la pièce jointe 19479


peut etre que ça empeche le dropplet d'ouvrir le fichier ?


*EDIT : *
je viens de trouver ce script sur le net (iScript.fr): 


```
on open (liste_des_fichiers)
repeat with le_fichier_a_nettoyer in liste_des_fichiers
tell application "BBEdit"
activate
open le_fichier_a_nettoyer
replace "\t" using "" searching in text 1 of text window 1 options {search mode:literal, starting at top:true, wrap around:false, reverse:false, case sensitive:false, match words:false, extend selection:false}
replace return using "" searching in text 1 of text window 1 options {search mode:literal, starting at top:true, wrap around:false, reverse:false, case sensitive:false, match words:false, extend selection:false}
replace " " using "" searching in text 1 of text window 1 options {search mode:literal, starting at top:true, wrap around:false, reverse:false, case sensitive:false, match words:false, extend selection:false}
save text window 1
close text window 1
end tell
end repeat
end open
```

mais il marche pas du tout chez moi ... il me dit que la syntaxe n'est pas bonne :/


----------



## tatouille (13 Décembre 2008)

un simple grep -R sed -> newfile ferait l'affaire en une ligne de bash c'est regle ton histoire


----------



## BS0D (14 Décembre 2008)

tatouille a dit:


> un simple grep -R sed -> newfile ferait l'affaire en une ligne de bash c'est regle ton histoire



Pas tout compris là... peux tu détailler un peu ? 

Je suis en train de galérer pour trouver des actions automator ou pour faire ça en applescript mais j'arrive à rien ... ça commence à me gaver ...


----------



## pascalformac (14 Décembre 2008)

BS0D a dit:


> . ça commence à me gaver ...


ce gavage , quel timing  et quelle abnegation, quel sens du sacrifice !
c'est toi le futur repas de fete dans ta famille?

détail , si c'est le cas ,  tu fais don de ton mac?Si oui tu previens et je m'arrange pour une couronne dédicacée à l'enterrement
_"Au regretté  blue screen of digestion"_ ca t'irait?


----------



## zacromatafalgar (14 Décembre 2008)

BS0D a dit:


> Alors peut etre que je m'y prends mal : j'ai essayé en l'enregistrant en tant qu'application option application executable uniquement et un peu toutes les autres options.
> mais quand je rouvre mes fichiers, le texte à remplacer n'a disparu que dans un des fichiers droppés dessus (c'est bien un dropplet hein?!)



Enregistre au format Progiciel (universal) en ne cochant aucune case et particulièrement "Exécutable uniquement" car cette dernière t'empêche, si elle est cochée, d'accéder au code et donc de le visualiser/modifier en déposant le droplet sur l'icône de l'Éditeur de script


----------



## BS0D (14 Décembre 2008)

Bon je crois que je vais reprendre le guide pdf de l'applescript et me faire un truc propre, car ça marche toujours pas. 

Il fait bien son travail sur les fichiers qui ont déjà été ouverts, mais me demande toujours confirmation d'ouvrir les fichiers qui ne l'ont pas déjà été, puis s'arrête. 

Donc je suis obligé de refaire la meme manip à chaque fois qu'il tombe sur un fichier qui n'a pas été ouvert et qu'il me demande confirmation comme là :


----------



## zacromatafalgar (15 Décembre 2008)

J'ai trouvé une page en anglais qui explique comment supprimer cet avertissement.

En gros, il faut attacher un script à un dossier. Il faut ensuite déposer tes fichiers dans ce dossier qui se charge de marquer les fichiers comme lus&#8230;

Le script se trouve dans le dernier paragraphe intitulé "A more elegant solution"

http://theappleblog.com/2008/03/26/disabling-launch-services-file-quarantine/

Essaye le sur quelques fichiers, si le test est concluant, nous l'intégreront au script complet&#8230;


----------



## BS0D (15 Décembre 2008)

salut, 

Il semble que le script ne marche pas. Certains de mes fichiers apparaissent comme des "scripts applications" et il les ouvre pas automatiquement. 

Maintenant, j'ai aussi trouvé cette page via ton lien, que j'ai fait : j'ai ajouté ce code dans ~/Library/Preferences/com.apple.DownloadAssessment.plist

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>LSRiskCategorySafe</key>
<dict>
    <key>LSRiskCategoryContentTypes</key>
<array>
    <string>public.html</string>
    <string>public.php</string>
    <string>public.dmg</string>
    <string>public.doc</string>
    <string>public.docx</string>
    <string>public.jpg</string>
    <string>public.png</string>
    <string>public.zip</string>
    <string>public.rar</string>
    <string>public.script</string>
    <string>public.php-script</string>
    <string>public.app</string>
</array>
</dict>
</dict>
</plist>
```
mais cette méthode n'est pas concluante non plus....

peut être après un reboot? Je vais essayer et je te tiens au courant, mais j'en ai un peu marre de tourner en rond là!


----------



## zacromatafalgar (15 Décembre 2008)

Comment as-tu testé le script ?

As-tu bien attaché le script à un dossier ?

Je n'ai pas encore eu le temps de tester mais dès que je l'ai


----------



## BS0D (15 Décembre 2008)

zacromatafalgar a dit:


> Comment as-tu testé le script ?
> 
> As-tu bien attaché le script à un dossier ?



Oui j'ai bien attaché le script au dossier en question... 
Ensuite, j'ai foutu tous mes fichiers et dossiers dans le dossier scripté et il se passe rien. et dès que je tente de rouvrir les fichiers, j'ai le pop de merde qui dit que c'est pas safe ...

EDIT: j'ai testé d'autres actions de dossiers sur d'autres dossiers et ça marche très bien... mais pas celle-ci :/


----------



## zacromatafalgar (15 Décembre 2008)

Il fonctionne bien sur ma configuration (G4 1,25 - 10.5.5), tests effectués avec une application et des pages html.


----------



## BS0D (15 Décembre 2008)

Effectivement, il semble que ce script ne marche qu'avec des documents *TÉLÉCHARGÉS* *d'internet*, et pas lorsqu'on les transfère d'un autre dossier, donc autant pour moi ça roule. 

J'ai donc ENFIN réussi ! 

Mais, y'a t-il moyen, à tout hasard et pour être chiant jusqu'au bout, d'améliorer ton script pour qu'il fasse un search&replace récursif dans les sous-dossier / sous-sous-dossiers? 

Merci en tous cas pour ton aide précieuse, *zacromatafalgar*


----------



## zacromatafalgar (15 Décembre 2008)

BS0D a dit:


> J'ai donc ENFIN réussi !






> Mais, y'a t-il moyen, à tout hasard et pour être chiant jusqu'au bout, d'améliorer ton script pour qu'il fasse un search&replace récursif dans les sous-dossier / sous-sous-dossiers?



Vos désirs sont des ordres 

J'ai rajouté une vérification du type de fichier afin que, si un fichier autre que html ou php se présente, il n'y ai pas d'erreur


```
property textToFind : "footer"
property textToWrite : "test"
property extensionList : {"html", "php"}

on open theDrop
	set nbrItems to count of theDrop
	repeat with thisFile from 1 to nbrItems
		set theFile to (item thisFile of theDrop)
		
		set itemInfo to info for theFile
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(theFile)
		else if (alias of itemInfo is false) and (name extension of itemInfo is in extensionList) then
			processItem(theFile)
		end if
		
	end repeat
end open

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
```


----------



## zacromatafalgar (15 Décembre 2008)

J'ai rajouté la désactivation du message d'avertissement mais, pour cela, il a fallut "castrer" l'application.

En effet, il n'est plus possible de déposer des éléments sur l'icône, il faut maintenant effectuer un double-clic puis choisir un dossier 

```
property textToFind : "footer"
property textToWrite : "test"
property extensionList : {"html", "php"}

on run
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set thisItemPos to (quoted form of POSIX path of (thisitem as alias))
	do shell script "xattr -d com.apple.quarantine " & (thisItemPos as text)
	
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x (**)
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
```


----------



## BS0D (15 Décembre 2008)

Trop la classe, ça marche nickel 

Par contre, comme je suis un imbécile de perfectionniste, je vais essayer de finaliser le truc de manière à pouvoir définir puis stocker dans une variable le texte à chercher, puis celui à remplacer avant d'ouvrir le dossier à traiter 

Comme ça, j'aurai pas à refaire le script à chaque fois que je veux changer quelquechose de différent ...

Je peux plus te bouler c'est dommage, mais tu le mérites bien


----------



## zacromatafalgar (15 Décembre 2008)

BS0D a dit:


> Par contre, comme je suis un imbécile de perfectionniste, je vais essayer de finaliser le truc de manière à pouvoir définir puis stocker dans une variable le texte à chercher, puis celui à remplacer avant d'ouvrir le dossier à traiter


Remplace le bloc "on run - end run" par le suivant :

```
on run
	set textToFind to text returned of (display dialog "Saisi le texte à rechercher : " default answer "" with icon 1)
	set textToWrite to text returned of (display dialog "Saisi le texte de remplacement : " default answer "" with icon 1)
	
	set theFolder to (choose folder)
	processFolder(theFolder)
end run
```



> Je peux plus te bouler c'est dommage, mais tu le mérites bien


Bah alors y'a plus moyen que je te ponde une ligne


----------



## BS0D (15 Décembre 2008)

Yes, ça j'ai quand meme réussi à le faire tout seul 
Merci quand meme


----------



## L`artiste (17 Septembre 2009)

Bonjour à tous,
après avoir essayé en vain de faire l'équivalent de ce script sous Automator, j'ai trouvé ce topic.

Malheureusement, je suis bloqué sur une difficulté.
Pour que ce script tourne, j'ai dû dans un premier temps enlevé la condition "xattr -d com.apple.quarantine ".
Car sur les fichiers auxquels je voulais les appliquer l'attribut xattr n'existait pas.
Je pensais qu'une fois ce problème résolu, il pourrait parcourir mes fichiers comme du texte.
Pour info, je cherche à parser des fichiers sfv créé sous XP et à remplacer un caractère spécial (à cause de l'incompatibilité des deux systèmes sur la table de codage) par un autre pris en charge par Mac OS X.
Je donne donc le caractère à remplacer, le remplaçant de ce caractère puis le dossier contenant tous les fichiers sfv.
Mais dès le premier fichier sfv rencontré, il stoppe suite à cette erreur :

line 1: syntax error near unexpected token `;'

et effectivement le fichier commence par trois lignes de commentaire (; est apparemment le tag pour les commentaires dans ce type de fichier).

Mais je ne comprends pas pourquoi ce caractère pose problème... je suis un gueux en AppleScript mais un programmeur expérimenté en Java. Je ne connais malheureusement pas le délimiteur en AppleScript mais si effectivement c'est le ";" je suis bien dans l'ennui.

Merci pour votre aide.


----------



## zacromatafalgar (18 Septembre 2009)

Salut l'artiste&#8230;et bienvenu sur MacGe&#8230; 

Le delimiter par défaut est "" (entre les guillemets), pourrais-tu mettre en ligne un de ces fichiers ?

Quel caractère est à remplacer ? Par quoi ?

Si ce n'est pas confidentiel bien sûr&#8230;


----------



## L`artiste (18 Septembre 2009)

Merci pour l'accueil ! ^^
Ca fait un bail que je lis les news et j'avais toujours trouvé la réponse à mes problèmes en lisant le forum. Quand j'ai vu ce topic je me suis dit : bonne pioche.

Si je te mets le contenu du fichier ça te va ?
Bon ce que je fais, je mets le contenu texte et le fichier attaché en zip...
Bien que le fichier se comporte comme un fichier texte.


```
; Generated by QuickSFV v2.22 on 2004-01-02 at 15:42:02
;
;    243942814  12:10.40 2003-12-17 [ax]_ranma_&#937;_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv
[ax]_ranma_&#937;_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv E6519292
;Q2-1c4ea928b5e0f70
;Q2-oOCvh2uExQE=
;Q2-gA==
```

Le &#937; pose problème...


----------



## zacromatafalgar (18 Septembre 2009)

J'ai essayé de remplacer &#937; et pas de problème chez moi, je te joins le droplet que tu peux ouvrir en le déposant sur l'Éditeur de script pour voir le code&#8230;

Dépose un de tes fichiers, tu pourras constater que la lecture et le remplacement s'effectuent correctement, le problème survient peut être au cours de l'écriture, j'essaierais de voir ça plus tard &#8230; 

Bonsoir.

Finalement j'ai pris quelques minutes pour enlever le superflu du script précédent, je l'ai essayé, il fonctionne, j'ai vérifié si les fichiers étaient bien modifiés et c'est le cas&#8230; Je n'ai vérifié qu'avec 4 fichiers .sfv, enfin 1 seul mais dupliqué, après il est possible qu'un de tes fichiers pose problème&#8230;



```
property textToFind : "&#937;"
property textToWrite : "TEST"
property extensionList : {"html", "php", "SFV"}

on run
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
```


----------



## L`artiste (18 Septembre 2009)

zacromatafalgar tout d'abord merci pour ton aide.
J'ai essayé le sample, à première vue ça fonctionne.
Là dessus j'ai copié collé le code de ton script corrigé.
Au premier abord il remplace bien le caractère, j'ai ouvert le fichier et j'ai remarqué quelque chose de bizarre à propos de la dernière ligne. Je me suis dit : essaye si le fichier est toujours bon...
Et ma première intuition était la bonne : un fichier sfv ne peut comporter que le nom du fichier et ensuite le CRC correspondant. Si un caractère parasite (càd non commenté apparaît) le fichier est corrompu.
J'ai fait exécuté le script sur une copie de tout mes fichiers et l'anomalie s'est produite sur les trois fichiers au hasard que j'ai ouvert.
En fait, les deux derniers caractères de la "vraie" dernière ligne sont copié pour en créer une autre... Que la dernière ligne sont commentée comme c'est le cas ici, où que ce soit un CRC ne change rien il copie les deux derniers caractères de la dernière ligne.

Ce qui donne dans mon exemple : 

```
; Generated by QuickSFV v2.22 on 2004-01-02 at 15:42:02
;
;    243942814  12:10.40 2003-12-17 [ax]_ranma1_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv
[ax]_ranma1_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv E6519292
;Q2-1c4ea928b5e0f70
;Q2-oOCvh2uExQE=
;Q2-gA==
==
```

Les deux = sont recopiés. Imaginons que les 3 derniers commentaires et le "==" n'existaient pas, dans un autre fichier sans rien après le CRC nous aurions une ligne parasite avec "92". Les deux derniers caractères de la ligne.

J'espère que tu trouveras l'erreur et merci encore pour ton aide.


----------



## zacromatafalgar (19 Septembre 2009)

Bonjour,

Je ne parviens pas à reproduire l'erreur, les "==" ne sont pas rajoutés chez moi. 
Il serait intéressant de savoir précisément à quel moment sont ajoutés ces caractères indésirables, pour cela je te propose de rajouter le code suivant dans la routine processItem() après la ligne set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)


```
set textOk to ""
	set dataToWrite to dataToWrite as string
	display dialog "datatowrite : " & dataToWrite --les "==" sont-ils déjà présent ?
       --je rajoute une boucle pour récupérer tous les caractères sauf les 2 derniers
	set nbrChar to (count of characters of (dataToWrite as string))
	repeat with i from 1 to (nbrChar - 3)
		set textOk to textOk & (character i of dataToWrite)
	end repeat
	display dialog "textok : " & textOk --les "==" sont-ils toujours là ?
       --on change également la suite pour écrire textOk dans le fichier
	set x to open for access file (thisitem as string) with write permission
	write textOk to x
	close access x
```
        Vérifie maintenant la présence des "==" dans le fichier

Tu es sur Snow Leopard et moi sur Leopard, il faudrait qu'une autre personne sur SL teste ça afin d'être sûr que le problème ne vienne de ça.


----------



## BS0D (19 Septembre 2009)

Salut les petits gars, 

Moi je suis sous SL, je peux tester si vous voulez... vous m'avez tellement aidé avec mes soucis de contenu de fichier que je peux bien faire pareil 

Faites moi juste un petit récap de ce je dois tester parce que j'ai pas trop suivi ...


----------



## zacromatafalgar (19 Septembre 2009)

BS0D a dit:


> Salut les petits gars,
> 
> Moi je suis sous SL, je peux tester si vous voulez... vous m'avez tellement aidé avec mes soucis de contenu de fichier que je peux bien faire pareil
> 
> Faites moi juste un petit récap de ce je dois tester parce que j'ai pas trop suivi ...



Salut,

Il faut vérifier si les caractères _==_ sont rajoutés en fin à l'écriture du fichier .SFV, pour cela je te propose de télécharger l'archive en pièce jointe. 

Celle-ci contient 3 éléments :

Un dossier, intitulé "LartisteTest" contenant un fichier .SFV non traité
Une archive, intitulée "Lartiste_fichier_SFV_original .zip", qui contient le fichier .SFV de remplacement à déposer dans le dossier "LartisteTest"
Une application applescript, intitulée "LartisteApp", à lancer par double-clic ou bien via l'Éditeur de script

* Décompresser l'archive en pièce jointe puis lancer LartisteApp, une fenêtre s'affiche dans laquelle il faut choisir le dossier LartisteTest

* Ouvrir, avec TextEdit, le fichier .SFV contenu dans LartisteTest ainsi qu'une copie du fichier .SFV original (_archive "Lartiste_fichier_SFV_original .zip"_)

* Vérifier que le premier ne diffère du second que par deux caractères _&#937;_ remplacés par _TEST_, qu'aucun caractère ne soit rajouté à la fin

Ça va aller ?

Merci


----------



## BS0D (19 Septembre 2009)

Coucou zacromatafalgar 


OK, je viens de faire le test sous SL : 

Voir la pièce jointe 22177


Donc ça a l'air de marcher chez moi 


D'autres tests à faire ?


----------



## zacromatafalgar (19 Septembre 2009)

BS0D a dit:


> Coucou zacromatafalgar
> 
> 
> OK, je viens de faire le test sous SL :
> ...



Pour le moment non, le problème est ailleurs  merci

*L'artiste*, ce fichier de test ne fonctionne pas chez toi ?


----------



## L`artiste (21 Septembre 2009)

Le sample marche.
Cependant, la version sur laquelle se présentait la duplication de caractère était une version modifiée.
J'ai voulu que l'utilisateur entre le caractère à replacer et le remplaçant dans des champs.
Et en apportant encore cette modification à ton sample, cela me fait la même erreur...


```
property textToFind : ""
property textToWrite : ""
property extensionList : {"html", "txt", "SFV"}

on run
	set textToFind to text returned of (display dialog "Saisi le texte à rechercher : " default answer "" with icon 1)
	set textToWrite to text returned of (display dialog "Saisi le texte de remplacement : " default answer "" with icon 1)
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	
	(* --boucle vérification--
	set textOk to ""
	set dataToWrite to dataToWrite as string
	display dialog "datatowrite : " & dataToWrite
	set nbrChar to (count of characters of (dataToWrite as string))
	repeat with i from 1 to (nbrChar - 3)
		set textOk to textOk & (character i of dataToWrite)
	end repeat
	display dialog "textok : " & textOk
	*)
	
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	--write textOk to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
```

Ferais-je une erreur en initialisant les deux champs à "" ?
Si je voulais spécifier aussi dans un champ les extensions des fichiers, comment pourrait-on faire ça ?
Genre spécifier les extensions séparées par un ; (html;php;sfv) pour donner un exemple.

Merci.


----------



## zacromatafalgar (21 Septembre 2009)

L`artiste a dit:


> Cependant, la version sur laquelle se présentait la duplication de caractère était une version modifiée.
> J'ai voulu que l'utilisateur entre le caractère à replacer et le remplaçant dans des champs.
> Et en apportant encore cette modification à ton sample, cela me fait la même erreur...


Chez moi le changement ne provoque aucune erreur 



L`artiste a dit:


> Ferais-je une erreur en initialisant les deux champs à "" ?


 Non  non, aucune erreur.


L`artiste a dit:


> Si je voulais spécifier aussi dans un champ les extensions des fichiers, comment pourrait-on faire ça ?
> Genre spécifier les extensions séparées par un ; (html;php;sfv) pour donner un exemple.


C'est à dire que tu ne voudrais traiter que les fichiers dont les extensions sont dans la liste ?

Si c'est bien ça, une property est déjà là pour remplir ce rôle.
Il te suffit de rajouter les extensions, des fichiers à traiter, entre guillemets et séparés par des virgules. Tu peux également supprimer celles qui sont en trop 

Je te met l'app qui fonctionne chez moi en pièce jointe 
C'est : 
	
	



```
property extensionList : {"html", "txt", "SFV"}
```


----------



## BS0D (21 Septembre 2009)

zacromatafalgar a dit:


> C'est à dire que tu ne voudrais traiter que les fichiers dont les extensions sont dans la liste ?
> 
> Si c'est bien ça, une property est déjà là pour remplir ce rôle.
> Il te suffit de rajouter les extensions, des fichiers à traiter, entre guillemets et séparés par des virgules. Tu peux également supprimer celles qui sont en trop



Je crois qu'en fait l'ami voudrait que l'utilisateur puisse spécifier (manuellement) exactement les extensions à traiter par son script ... non ?


----------



## L`artiste (22 Septembre 2009)

Ca j'avais deviné que c'était cette propriété qui contenait la liste des extensions à traiter.
Mais je ne voudrais pas avoir à aller dans du code pour changer à chaque fois le type de fichiers traitables.
Tout comme le caractère recherché et le remplaçant, j'aimerais que l'utilisateur entre la ou les extensions des fichiers à traiter.
Séparée par un ; , donc que l'utilisateur ait un champ où il entre "html; php; sfv" en ne tenant pas compte des possibles espaces entre chaque extension (tronquer les blancs).

Donc en gros, comment faire un split sur base d'une chaine de caractères avec ; comme délimiteur et affecter ça à une variable.

Je n'ai pas encore testé l'application que tu m'as envoyé. Je le ferai plus tard dans la journée.

Encore merci de ton attention.


----------



## zacromatafalgar (22 Septembre 2009)

BS0D a dit:


> Je crois qu'en fait l'ami voudrait que l'utilisateur puisse spécifier (manuellement) exactement les extensions à traiter par son script ... non ?



Bien vu&#8230; 

*L'artiste*, il suffit de modifier le script comme ceci :


```
property textToFind : ""
property textToWrite : ""
property extensionList : missing value

on run
	log AppleScript's text item delimiters
	set textToFind to text returned of (display dialog "Saisi le texte à rechercher : " default answer "&#937;" with icon 1)
	set textToWrite to text returned of (display dialog "Saisi le texte de remplacement : " default answer "OKOKOK" with icon 1)
	set extensionList to {}
	set exten to text returned of (display dialog "Saisi les extensions des fichiers à traiter séparées par un point virgule." default answer "txt;SFV" with icon 1)
	buildExtList(exten)
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			beep 2
			processItem(thisitem)
		end if
	end repeat
end processFolder

--mise en forme de la liste
on buildExtList(textRet)
	set AppleScript's text item delimiters to ";"
	set theItems to text items of textRet as string
	set nbr to count of text items of theItems
	repeat with i from 1 to nbr
		set anExt to text item i of theItems
		set end of extensionList to anExt
	end repeat
	set AppleScript's text item delimiters to ""
end buildExtList

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	set AppleScript's text item delimiters to ""
	return theResult
end findReplace
```

J'ai simplement vidé la property extensionList, rajouté un display dialog, pour la saisie, dans le gestionnaire on run suivi de l'appel à la routine buildExtList() pour mettre en forme la liste d'extensions à partir du text retourné par le display dialog&#8230;


----------



## L`artiste (23 Septembre 2009)

Bon ben... je suis maudit je ne vois pas d'autre explication...
J'ai downloadé ton application, je l'ai exécutée sans la modifié ni l'ouvrir avec l'éditeur de script.
Je l'ai juste exécutée donc... et j'ai toujours la farce...

Je te joins tous les fichiers que je veux modifié avant et après... Moi je ne comprends plus en tout cas...


Dans le champ de ce que je recherche je mets "ranma_&#937;" et le remplaçant je mets "ranma".
Si c'est ça mon erreur c'est un peu léger...


----------



## L`artiste (23 Septembre 2009)

Bon... si c'est un seul caractère cela fonctionne dans certains cas...
Tu verras sur le panel de fichier que j'ai envoyé, sur certains l'erreur subsiste...

Content d'avoir trouvé le bug !
En général, c'est les gens qui trouvent les miens sur ce que j'ai développé ! ^^


----------



## zacromatafalgar (23 Septembre 2009)

Salut,

Bonne nouvelle cela semble fonctionner maintenant, c'est quand même beaucoup plus simple à résoudre avec des précisions sur le texte à rechercher, à remplacer

Il y avait effectivement un bug, je ne cherchais à remplacer que le &#937;, je n'avais pas essayé plusieurs caractèresmea culpa 

J'ai simplement effacé le fichier avant d'écrire

Voilà le code, j'ai rajouté 2 display dialog afin de voir à quel moment survenait l'erreur

```
property textToFind : ""
property textToWrite : ""
property extensionList : {}

on run
	log AppleScript's text item delimiters
	set textToFind to text returned of (display dialog "Saisi le texte à rechercher : " default answer "&#937;" with icon 1)
	set textToWrite to text returned of (display dialog "Saisi le texte de remplacement : " default answer "OKOKOK" with icon 1)
	set extensionList to {}
	set exten to text returned of (display dialog "Saisi les extensions des fichiers à traiter séparées par un point virgule." default answer "txt;SFV" with icon 1)
	buildExtList(exten)
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	--display dialog "dataToWrite : " & dataToWrite
	set x to open for access file (thisitem as string) with write permission
	set eof of the x to 0
	write dataToWrite to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

--mise en forme de la liste
on buildExtList(textRet)
	set AppleScript's text item delimiters to ";"
	set theItems to text items of textRet as string
	set nbr to count of text items of theItems
	repeat with i from 1 to nbr
		set anExt to text item i of theItems
		set end of extensionList to anExt
	end repeat
	set AppleScript's text item delimiters to ""
end buildExtList

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	set AppleScript's text item delimiters to ""
	--display dialog "theResult : " & theResult
	return theResult
end findReplace
```

edit : je n'ai testé que le remplacement de "_&#937;" par ""


----------



## L`artiste (28 Septembre 2009)

Merci beaucoup de votre aide collégiale et surtout de zacromatafalgar ! ^^

C'est exactement ce que je voulais !
J'espère avoir le temps de me plonger dans l'AppleScript un de ces 4, j'ai une autre idée de programme en tête.
Vous me reverrez peut-être pour poser l'une ou l'autre question.

Encore merci !


----------

