3 votos

Eliminar caracteres especiales sin acento y cambiar nombres en bloque

Antecedentes

Tengo un flujo de trabajo que recopila documentos de diversas fuentes, los convierte a PDF, los somete a OCR, los comprime, extrae su contenido y anotaciones, los carga en un servidor y realiza las correspondientes entradas en mysql para proporcionar un índice completo para mi motor de búsqueda basado en la web.

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

Cada archivo que se procesa en Applescript 'registra' en php/mysql usando curl. No sería un gran problema determinar el nuevo nombre de archivo con PHP, pero tengo problemas para renombrar 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 archivo que contienen los caracteres especiales mencionados anteriormente utilizando Applescript.

Los siguientes nombres de archivo deberían 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, los diacríticos alemanes se expanden (como Ä --> Ae, ü --> ue) y todos los demás acentos se convierten en su valor correspondiente 'sin acentuar' (como ñ --> n, é --> e) y los corchetes se convierten en espacios ((Ergänzung).pdf --> Ergaenzung .pdf)

Gracias por cualquier consejo

1voto

Steve Evans Puntos 155

Cambiar el 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"

Reducir un nombre de archivo a a-z es un poco complicado. Si te sientes cómodo con perl, hay un módulo ideal llamado Text::Unidecode. Otros enfoques, como el uso de expresiones regulares, son discutidos por Perl Monks en eliminando acentos.

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

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

0voto

nic Puntos 16

He encontrado una solución por mi cuenta y me gustaría compartir el resultado contigo: construí una especie de función torpe que busca y reemplaza los caracteres no deseados si aparecen en la cadena (desafortunadamente AppleScript devuelve malos resultados si la búsqueda y reemplazo no encuentra una ocurrencia).

Edit: Como encontré que los caracteres de los corchetes no son críticos, su transformación está excluida del script pegado a continuación. Por lo tanto, las agujas dadas al final de la función UnAccentString() deben ajustarse, si los corchetes también deben ser reemplazados.

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

Ten en cuenta que el orden de los reemplazos dentro de la función UnAccentString() es crucial. Cuando colocas la transformación de 'Ü' antes que la de 'ü', obtendrás malos resultados. Curiosamente, macOS parece considerar una 'ü' como válida al buscar 'Ü', pero no viceversa ni con otros* diacríticos. No tengo idea de por qué esto sucede pero funciona con este orden:

en UnAccentString(LaCadena)

si LaCadena contiene "ü" then
    set LaCadena to findAndReplace("ü", "Ue", LaCadena)
end if

si LaCadena contiene "ä" then
    set LaCadena to findAndReplace("ä", "ae", LaCadena)
end if

si LaCadena contiene "ö" then
    set LaCadena to findAndReplace("ö", "oe", LaCadena)
end if

si LaCadena contiene "Ü" then
    set LaCadena to findAndReplace("Ü", "Ue", LaCadena)
end if

si LaCadena contiene "Ä" then
    set LaCadena to findAndReplace("Ä", "Ae", LaCadena)
end if

si LaCadena contiene "Ö" then
    set LaCadena to findAndReplace("Ö", "Oe", LaCadena)
end if

si LaCadena contiene "é" then
    set LaCadena to findAndReplace("é", "e", LaCadena)
end if

si LaCadena contiene "è" then
    set LaCadena to findAndReplace("è", "e", LaCadena)
end if

si LaCadena contiene "à" then
    set LaCadena to findAndReplace("à", "a", LaCadena)
end if

si LaCadena contiene "ó" then
    set LaCadena to findAndReplace("ó", "o", LaCadena)
end if

si LaCadena contiene "á" then
    set LaCadena to findAndReplace("á", "a", LaCadena)
end if

si LaCadena contiene "ú" then
    set LaCadena to findAndReplace("ú", "u", LaCadena)
end if

si LaCadena contiene "í" then
    set LaCadena to findAndReplace("í", "i", LaCadena)
end if

si LaCadena contiene "Á" then
    set LaCadena to findAndReplace("Á", "A", LaCadena)
end if

si LaCadena contiene "É" then
    set LaCadena to findAndReplace("É", "E", LaCadena)
end if

si LaCadena contiene "Í" then
    set LaCadena to findAndReplace("Í", "I", LaCadena)
end if

si LaCadena contiene "Ó" then
    set LaCadena to findAndReplace("Ó", "O", LaCadena)
end if

si LaCadena contiene "Ú" then
    set LaCadena to findAndReplace("Ú", "U", LaCadena)
end if

si LaCadena contiene "ñ" then
    set LaCadena to findAndReplace("ñ", "n", LaCadena)
end if

si LaCadena contiene "Ñ" then
    set LaCadena to findAndReplace("Ñ", "N", LaCadena)
end if

si LaCadena contiene "ê" then
    set LaCadena to findAndReplace("ê", "e", LaCadena)
end if

si LaCadena contiene "Ê" then
    set LaCadena to findAndReplace("Ê", "E", LaCadena)
end if

si LaCadena contiene "ë" then
    set LaCadena to findAndReplace("ë", "e", LaCadena)
end if

si LaCadena contiene "Ë" then
    set LaCadena to findAndReplace("Ë", "E", LaCadena)
end if

si LaCadena contiene "È" then
    set LaCadena to findAndReplace("È", "E", LaCadena)
end if

si LaCadena contiene ":" then
    set LaCadena to findAndReplace(":", "", LaCadena)
end if

si LaCadena contiene "," then
    set LaCadena to findAndReplace(",", "", LaCadena)
end if

si LaCadena contiene " " then
    set LaCadena to findAndReplace(" ", "-", LaCadena)
end if

si LaCadena contiene "%" then
    set LaCadena to findAndReplace("%", "", LaCadena)
end if

si LaCadena contiene "'" then
    set LaCadena to findAndReplace("'", "", LaCadena)
end if

return LaCadena & ".pdf" as text
end UnAccentString

en findAndReplace(parabuscar, parareemplazar, LaCadena)
establecer ditd a separadores de elementos de texto
establecer res a valor faltante
establecer separadores de elementos de texto a parabuscar
repetir con tis en elementos de texto de LaCadena
    si res es valor faltante then
        establecer res a tis
    de lo contrario
        establecer res a res & parareemplazar & tis
    fin si
fin repetir
establecer separadores de elementos de texto a ditd
return res
end findAndReplace

Por lo tanto, llamar 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

devolverá

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

Esta es una lista de todos los caracteres que la función busca y sus respectivos contrapartes con los que se reemplazan:

  • Ü --> 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
  • : --> (vacío)
  • , --> (vacío)
  • (espacio) --> -
  • % --> (vacío)
  • ' --> (vacío)

Espero que esto ayude a alguien. ¡Saludos, nic!

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X