Renommer le contenu de fichiers en Applescript / Automator?

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...

Bloc de code:
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.
 
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… ;)

Ferais-je une erreur en initialisant les deux champs à "" ?
Non non, aucune erreur.
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 :
Bloc de code:
property extensionList : {"html", "txt", "SFV"}
 
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 ?
 
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.
 
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… :up:

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

Bloc de code:
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 "Ω" 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… ;)
 
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_Ω" et le remplaçant je mets "ranma".
Si c'est ça mon erreur c'est un peu léger...
 
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é ! ^^
 
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 Ω, 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…
Bloc de code:
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 "Ω" 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 "_Ω" par "" ;)
 
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 !