3 votes

Supprimer les caractères spéciaux et renommer en masse

Contexte

J'ai mis en place un flux de travail qui collecte des documents de diverses sources, les convertit en PDF, les OCRise, les compresse, en extrait le contenu et les annotations, les télécharge sur un serveur et crée les entrées correspondantes dans mysql afin de fournir un index complet pour mon moteur de recherche basé sur le web.

Pour afficher les PDF dans le moteur de recherche, j'utilise PDF.js de Mozilla, qui, dans certains cas, ne parvient pas à charger des documents contenant certains caractères dans le nom de fichier. Ces caractères critiques incluent les trémas allemands (Ä,Ö,Ü,ä,ö,ü), les parenthèses ((),[],{}), les accents français (é,è,à) et les accents espagnols (Ñ,ñ,Ó,ó,Á,á,É,é,Í,í,Ú,ú).

Chaque fichier traité dans AppleScript 'check in' dans php/mysql en utilisant curl. Il ne serait pas difficile de déterminer le nouveau nom de fichier avec PHP, mais j'ai du mal à renommer les fichiers qui contiennent les caractères mentionnés dans leur nom de fichier avec AppleScript vers un nom standardisé.

Question

J'aimerais mettre en place une fonction qui standardise les noms de fichiers contenant les caractères spéciaux mentionnés ci-dessus en utilisant AppleScript.

Les noms de fichiers suivants devraient devenir leurs valeurs correspondantes à droite

  • Riñón.pdf --> Rinon.pdf
  • Ergänzung.pdf --> Ergaenzung.pdf
  • Übersicht.pdf --> Uebersicht.pdf
  • Système impérmeable.pdf --> Systeme impermeable.pdf

En bref, les trémas allemands sont étendus (comme Ä --> Ae, ü --> ue) et tous les autres accents deviennent leur valeur correspondante 'non accentuée' (comme ñ --> n, é --> e) et les parenthèses deviennent des espaces ((Ergänzung).pdf --> Ergaenzung .pdf)

Merci pour tout conseil

1voto

Graham Miln Points 39606

Renommer un fichier en AppleScript peut être réalisé à travers le Finder :

tell application "Finder"
   set the name of file "Monterey" to "Eden"

Réduire un nom de fichier à a-z est délicat. Si vous êtes à l'aise avec perl, il existe un module idéal appelé Text::Unidecode. D'autres approches, telles que l'utilisation d'expressions régulières, sont discutées par Perl Monks dans suppression des accents.

Vous mentionnez l'utilisation de php, donc cette question pourrait fournir des réponses plus faciles à intégrer dans votre flux de travail, Comment supprimer les accents des caractères dans une chaîne PHP ?. La réponse la mieux notée suggère :

function stripAccents($stripAccents){
  return strtr($stripAccents,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ','aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
}

0voto

nikib3ro Points 212

J'ai trouvé une solution moi-même et je voudrais partager le résultat avec vous : j'ai créé une sorte de fonction maladroite qui recherche et remplace les caractères non désirés s'ils apparaissent dans la chaîne de caractères (malheureusement, AppleScript renvoie de mauvais résultats si la recherche et le remplacement ne trouvent pas d'occurrence).

Édition : Comme j'ai constaté que les caractères en crochets étaient sans importance, leur transformation est exclue du script ci-dessous. Par conséquent, les éléments donnés au bas de la fonction UnAccentString() doivent être ajustés si les crochets doivent également être remplacés.

La fonction findAndReplace() est offerte par MacScripter, merci.

Soyez conscient que l'ordre des remplacements dans la fonction UnAccentString() est crucial. Si vous placez la transformation 'Ü' au-dessus de 'ü', vous obtiendrez de mauvais résultats. Curieusement, OS X semble considérer un 'ü' comme valide lorsqu'il recherche des 'Ü', mais pas vice versa ni avec d'autres umlauts. Aucune idée pour quoi cela se passe mais ça fonctionne avec cet ordre :

on UnAccentString(TheString)

if TheString contains "ü" then
    set TheString to findAndReplace("ü", "Ue", TheString)
end if

if TheString contains "ä" then
    set TheString to findAndReplace("ä", "ae", TheString)
end if

if TheString contains "ö" then
    set TheString to findAndReplace("ö", "oe", TheString)
end if

if TheString contains "Ü" then
    set TheString to findAndReplace("Ü", "Ue", TheString)
end if

if TheString contains "Ä" then
    set TheString to findAndReplace("Ä", "Ae", TheString)
end if

if TheString contains "Ö" then
    set TheString to findAndReplace("Ö", "Oe", TheString)
end if

if TheString contains "é" then
    set TheString to findAndReplace("é", "e", TheString)
end if

if TheString contains "è" then
    set TheString to findAndReplace("è", "e", TheString)
end if

if TheString contains "à" then
    set TheString to findAndReplace("à", "a", TheString)
end if

if TheString contains "ó" then
    set TheString to findAndReplace("ó", "o", TheString)
end if

if TheString contains "á" then
    set TheString to findAndReplace("á", "a", TheString)
end if

if TheString contains "ú" then
    set TheString to findAndReplace("ú", "u", TheString)
end if

if TheString contains "í" then
    set TheString to findAndReplace("í", "i", TheString)
end if

if TheString contains "Á" then
    set TheString to findAndReplace("Á", "A", TheString)
end if

if TheString contains "É" then
    set TheString to findAndReplace("É", "E", TheString)
end if

if TheString contains "Í" then
    set TheString to findAndReplace("Í", "I", TheString)
end if

if TheString contains "Ó" then
    set TheString to findAndReplace("Ó", "O", TheString)
end if

if TheString contains "Ú" then
    set TheString to findAndReplace("Ú", "U", TheString)
end if

if TheString contains "ñ" then
    set TheString to findAndReplace("ñ", "n", TheString)
end if

if TheString contains "Ñ" then
    set TheString to findAndReplace("Ñ", "N", TheString)
end if

if TheString contains "ê" then
    set TheString to findAndReplace("ê", "e", TheString)
end if

if...

return TheString &.pdf; as text
end UnAccentString

on findAndReplace(tofind, toreplace, TheString)
set ditd to text item delimiters
set res to missing value
set text item delimiters to tofind
repeat with tis in text items of TheString
    if res is missing value then
        set res to tis
    else
        set res to res & toreplace & tis
    end if
end repeat
set text item delimiters to ditd
return res
end findAndReplace

Par conséquent, appeler la fonction avec la chaîne suivante :

return UnAccentString("Übersetzungen im alltäglichen Leben eines Riñóns und eines Négligée à Noël") as text

renverra

Uebersetzungen-im-alltaeglichen-Leben-eines-Rinons-und-eines-Negligee-a-Noel

Voici la liste de tous les caractères que la fonction recherche et leurs contreparties avec lesquelles ils sont remplacés :

  • Ü --> Ue
  • Ä --> Ae
  • Ö --> Oe
  • ü --> Ue
  • ä --> ae
  • ö --> oe
  • é --> e
  • è --> e
  • à --> a
  • ó --> o
  • á --> a
  • ú --> u
  • í --> i
  • Á --> A
  • É --> E
  • Í --> I
  • Ó --> O
  • Ú --> U
  • ñ --> n
  • Ñ --> N
  • ê --> e
  • Ê --> E
  • ë --> e
  • Ë --> E
  • È --> E
  • : --> (null)
  • , --> (null)
  • (espace) --> -
  • % --> (null)
  • ' --> (null)

J'espère que cela aidera quelqu'un. Salutations, nic.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X