Unaccent Caracteres especiales y cambio de nombre masivo

3

Fondo

Tengo un flujo de trabajo que recopila documentos de varias fuentes, los convierte a PDF, los OCR los comprime, extrae sus contenidos y anotaciones, carga los archivos a un servidor y realiza las entradas de mysql correspondientes para proporcionar una Índice destacado de mi motor de búsqueda basado en la web.

Para mostrar archivos PDF en el motor de búsqueda, uso PDF.js de mozilla, que en algunos casos no puede cargar documentos con ciertos caracteres en el nombre del archivo. Estos caracteres críticos incluyen diéresis alemanas (Ä, Ö, Ü, ä, ö, ü), corchetes ((), [], {}), acentos franceses (é, è, à) y acentos españoles (Ñ, ñ, Ó , ó, Á, á, É, é, Í, í, Ú, ú).

Todos los archivos que se procesan en applecript 'ingresan' a php / mysql usando curl. No sería una gran cosa determinar el nuevo nombre de archivo con PHP, pero tengo problemas para cambiar el nombre de los archivos que tienen los caracteres mencionados en su nombre de archivo con AppleScript a un nombre estandarizado.

Pregunta

Me gustaría implementar una función que estandarice los nombres de los archivos que contienen los caracteres especiales mencionados anteriormente utilizando applescript.

Los siguientes nombres de archivo deben convertirse en sus valores correspondientes a la derecha

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

En resumen, las diéresis alemanas se expanden (como Ä - > Ae, ü - > ue) y todos los demás acentos se convierten en su valor correspondiente "sin acento" (como ñ - > n, é - & gt ; e) y los corchetes se convierten en espacios ((Ergänzung) .pdf - > Ergaenzung .pdf)

Gracias por cualquier consejo

    
pregunta nic 12.03.2014 - 09:43

2 respuestas

0

Yo mismo encontré una solución y me gustaría compartir el resultado con usted: construí una especie de función torpe que encuentra y reemplaza los caracteres no deseados si aparecen en la cadena (desafortunadamente AppleScript devuelve malos resultados si el hallazgo y -emplazar no encuentra una ocurrencia.

Editar: Como he encontrado que los caracteres del corchete no son críticos, su transformación se excluye del script pegado a continuación. Por lo tanto, las agujas indicadas en la parte inferior de la función UnAccentString() deben ajustarse, si los corchetes también deben reemplazarse.

La función findAndReplace() es cortesía de MacScripter , gracias.

Tenga en cuenta que el orden de los reemplazos dentro de la función UnAccentString() es crucial. Cuando coloca la transformación 'Ü' sobre la 'ü', obtendrá malos resultados. Curiosamente, OS X parece considerar un 'ü' como válido cuando se busca 'Ü's, pero no al revés ni con otros * umlauts. No tengo idea de por qué sucede esto, pero funciona con este orden:

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

Por lo tanto, llamando a la función con la siguiente cadena:

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

volverá

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

Esta es una lista de todos los caracteres que busca la función y sus contrapartes respectivas con las que se reemplazarán:

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

Espero que ayude a alguien. Saludos, nic.

    
respondido por el nic 14.03.2014 - 16:44
1

El cambio de nombre de un archivo en AppleScript se puede realizar a través del Finder:

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

Reducir un nombre de archivo a a-z es complicado. Si se siente cómodo con perl , hay un módulo ideal llamado Text :: Unidecode . Perl Monks analiza otros enfoques, como el uso de expresiones regulares, en eliminación de acentos .

Usted menciona el uso de php , por lo que esta pregunta puede proporcionar respuestas más fáciles de integrar en su flujo de trabajo, ¿Cómo elimino los acentos de los caracteres en una cadena PHP? La respuesta más votada sugiere:

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

Lea otras preguntas en las etiquetas