Unaccent Caratteri speciali e bulk-rename

3

Sfondo

Ho un flusso di lavoro che raccoglie documenti da varie fonti, li converte in PDF, li OCR li comprime, estrae i loro contenuti e annotazioni, carica i file su un server e crea le voci mysql corrispondenti per fornire un indice in primo piano per il mio motore di ricerca basato sul Web.

Per visualizzare i PDF all'interno del motore di ricerca, utilizzo PDF.js da mozilla, che può, in alcuni casi, non caricare i documenti con determinati caratteri nel nome file. Questi caratteri critici includono dieresi tedesche (Ä, Ö, Ü, ä, ö, ü), parentesi ((), [], {}), accenti francesi (é, è, à) e accenti spagnoli (Ñ, ñ, Ó , O, A, A, E, e, i, i, u, u).

Ogni file che viene elaborato in applescript "controlla" in php / mysql usando curl. Non sarebbe un grosso problema determinare il nuovo nome di file con PHP, ma ho problemi a rinominare i file che hanno i caratteri menzionati nel loro nome con AppleScript su un nome standardizzato.

Domanda

Vorrei implementare una funzione che standardizza i nomi di file contenenti i caratteri speciali sopra menzionati usando il applescript.

I seguenti nomi di file dovrebbero diventare i loro valori corrispondenti sulla destra

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

In breve, le umlaut tedesche si espandono (come Ä - > Ae, ü - > ue) e tutti gli altri accenti diventano il loro valore corrispondente "non accentato" (come ñ - > n, é - & gt ; e) e le parentesi diventano spazi ((Ergänzung) .pdf - > Ergaenzung .pdf)

Grazie per qualsiasi consiglio

    
posta nic 12.03.2014 - 09:43
fonte

2 risposte

0

Ho trovato una soluzione da solo e vorrei condividere il risultato con te: ho creato una specie di funzione maldestra che trova e sostituisce i caratteri indesiderati se compaiono nella stringa (purtroppo AppleScript restituisce risultati errati se il find- e-replace non trova alcuna occorrenza.

Modifica: come ho trovato i caratteri di parentesi per essere acritico, la loro trasformazione è esclusa dallo script incollato di seguito. Pertanto, gli aghi indicati nella parte inferiore della funzione UnAccentString() devono essere regolati, se anche le parentesi devono essere sostituite.

La funzione findAndReplace() è per gentile concessione di MacScripter , grazie.

Tieni presente che l'ordine delle sostituzioni all'interno della funzione UnAccentString() è cruciale. Quando posizioni la trasformazione "Ü" sopra il "ü", otterrai risultati sbagliati. È interessante notare che OS X sembra considerare un 'ü' valido quando si cerca 'Ü's, ma non viceversa, né con altri dieresi *. Non ho idea del motivo per cui ciò sta accadendo, ma funziona con questo ordine:

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 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("Ë", "E", TheString)
end if

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

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

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

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

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

if TheString contains "'" then
    set TheString to findAndReplace("'", "", TheString)
end 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

Pertanto, chiama la funzione con la seguente stringa:

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

restituirà

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

Questa è una lista di tutti i caratteri che la funzione cerca e le rispettive controparti con cui vengono sostituiti:

  • Ü - > 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)
  • (spazio) - > -
  • % - > (Null)
  • '- > (Null)

Spero che aiuti qualcuno. Saluti, nic.

    
risposta data 14.03.2014 - 16:44
fonte
1

Rinominare un file in AppleScript può essere eseguito tramite il Finder:

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

Ridurre un nome di file ad a-z è complicato. Se hai dimestichezza con perl , esiste un modulo ideale chiamato Text :: Unidecode . Altri approcci, come l'uso di espressioni regolari, sono discussi da Perl Monks in rimozione di accenti .

Hai menzionato l'utilizzo di php , quindi questa domanda potrebbe fornire risposte più semplici da integrare nel tuo flusso di lavoro, Come rimuovo gli accenti dai caratteri in una stringa PHP? La risposta più votata suggerisce:

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

Leggi altre domande sui tag