• Publicidad

Expresión regular para quitar tildes

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Expresión regular para quitar tildes

Notapor MARKO » 2012-05-23 10:36 @483

Saludos, Perl en español:

Tengo un grupo numeroso de palabras así como INTERCONEXIÓN, MÉXICO, etc.

La situación es que en los archivos que analizaré a veces viene una con tilde y la otra no, las dos con tilde o ninguna con tilde. Sé que se podría escribir una expresión regular para sustituir MÉXICO por MEXICO para analizar todo sin tildes pero como es un grupo numeroso de palabras, me pregunto si hay alguna expresión regular que permita quitar las tildes de cualquier palabra sin importar cuál sea.

Gracias por adelantado.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Publicidad

Re: Expresión regular para quitar tildes

Notapor explorer » 2012-05-23 10:52 @494

Y los datos de entrada, ¿en qué codificación están? ¿iso-8859-1, utf-8, ansi, cp-1252,...?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular para quitar tildes

Notapor MARKO » 2012-05-23 10:58 @498

explorer escribiste:Y los datos de entrada, ¿en qué codificación están? ¿iso-8859-1, utf-8, ansi, cp-1252,...?


¡Qué buena pregunta! :?

Dame un tip para averiguarlo. Simplemente son datos que jalo de una hoja de Excel con el SpreadSheet::Read.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Re: Expresión regular para quitar tildes

Notapor explorer » 2012-05-23 11:22 @515

Yo también uso SpreadSheet::Read para leer Excel.
En la mayor parte de las situaciones, las hojas están codificadas en una única codificación (generalmente utf-8, con los últimos Windows), así que no es necesario hacer nada, salvo acordarse de que tenemos que trabajar en utf-8.

En cambio, con software y Excel viejos, pueden venir en distintas codificaciones, incluso celdas con codificaciones distintas.

No queda entonces más remedio que abrir la hoja con SpreadSheet::Read con la opción de que genere los atributos, y mirar en ellos por la codificación de la celda. Y con la función from_to() de Encode, pasarlo todo a una sola codificación.

Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Leer la base de datos del archivo Excel $FICHERO_BASE,
  2. # pero no queremos que genere referencias nominales a las celdas,
  3. # y sí, el hash de atributos de cada celda.
  4. my $BASE = ReadData($FICHERO_BASE, cells => 0, attr => 1);
  5. die "ERROR: Base de datos no encontrada" if not $BASE;
  6.  
  7. #my %HOJAS  = %{$BASE->[0]{sheet}};             # Relación hojas -> índices
  8.  
  9. my $HOJA = $BASE->[ 1 ]->{cell};               # Solo me interesa la primera hoja
  10. my $ATTR = $BASE->[ 1 ]->{attr};               # Atributos de las celdas de la primera hoja
  11. exit if ! $HOJA;
  12.  
  13. # Recorrer toda la matriz
  14. my $maximo_filas = $BASE->[ 1 ]->{maxrow};
  15. my $maximo_cols  = $BASE->[ 1 ]->{maxcol};
  16.  
  17. for my $fila (1 .. $maximo_filas) {
  18.     for my $columna (1 .. $maximo_cols) {
  19.         my $contenido_celda = $HOJA->[$columna]->[$fila];
  20.         if ($contenido_celda) {                                 # si hay algo en la celda...
  21.             if ($ATTR->[$columna]->[$fila]->{enc}) {            # ¿tiene atributo de codificación?
  22.  
  23. # esta línea es obsoleta: cambiaba a codificación 'utf-16' en caso de que hubiera una 'ucs2'
  24. #                $ATTR->[$columna]->[$fila]->{enc} = 'utf-16' if $ATTR->[$columna]->[$fila]->{enc}  eq 'ucs2';
  25.  
  26.                 # pasamos de la codificación en que esté, a 'iso-8859-1'
  27.                 my $b = from_to($contenido_celda, $ATTR->[$columna]->[$fila]->{enc}, "iso-8859-1");
  28.             }
  29.         }
  30.         else {
  31.             ...;
  32.         }
  33.     }
  34. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Con la función from_to(), pasamos lo que sea, de la codificación que sea, a 'iso-8859-1'. El resultado queda en la propia $contenido_celda. En la mayor parte de los casos, la codificación que aparece en las celdas será 'utf-16'... pero depende de la versión de M$Office y/o M$Windows que estés usando...

Si no sabes en qué codificación está, haz un Dumper del hash de atributos, y así verás, en los campos 'enc', en qué están puestas las celdas.

En cuanto a quitar las tildes, ya hemos hablado de ese asunto...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 15 invitados