• Publicidad

Eliminar carácter especial fin de línea

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

Eliminar carácter especial fin de línea

Notapor rafical » 2010-02-10 12:00 @541

Hola amigos, estaba revisando el foro, me parece muy bueno y muy útil para la comunidad. Más que todo ayuda mutua para resolver problemas de este poderoso lenguaje.

Estoy con algunos archivos planos, que genero una base de datos. Cada columna está separada por el carácter '|~' pero al final de cada línea contiene (observando con algún de editor de texto especial) un rectangulito pequeño y luego viene el salto de línea. Parece que es un tab, pero trato de eliminar dicho carácter y no puedo.

El código que he estado trabajando es el siguiente.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open P, "$dirFile\\Desa_User\\RUC_TIPOS_CONTRIBUYENTE.txt";
  2. open (P2, ">>$dirFile\\Desa_User\\flat_file.out");
  3. $i = 0;
  4. while(<P>){
  5.         $linea = <P>;
  6.         #$p = "prueba";
  7.         #$linea =~ s/\s+//g;
  8.         #$linea =~ s/[\n\r]//g;
  9.         $linea =~ s/^\t*//;
  10.         #chomp($linea);
  11.         #@paramFile = split('/|~', $linea);
  12.         #print "$paramFile[$i]\n";
  13.         #print "$linea\n";
  14.         #$linea =~ s/\r\n/' + Chr(13) + Chr(10) + '/g;
  15.         #$linea =~ s/\r\n/"dd"/g;
  16.         #$paramFile[7] =~ s/\x0d\x0a/' + Chr(13) + Chr(10) + '/;
  17.        
  18.         #$paramFile[7] =~ s/\r//g;
  19. #       print "$paramFile[7]\n";
  20.         print P2 "$linea\n";
  21.         #print "$linea\n";
  22.         $i += 1;       
  23. }
  24. close(P);
  25. close(P2);
  26.  
  27. exit 0;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Como pueden observar he intentado varias opciones para tratar de eliminar dicho carácter pero ninguna me ha resultado hasta el momento.

Por favor, ¿¿si me ayudan con alguna idea??
rafical
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-02-10 11:05 @503

Publicidad

Re: Eliminar carácter especial fin de línea

Notapor explorer » 2010-02-10 12:40 @569

Bienvenido a los foros de Perl en Español, rafical.

La expresión regular que estás usando,

$linea =~ s/^\t*//;

está buscando por tabuladores al principio (^) de la línea, no al final. Debería ser así:

$linea =~ s/\t*$//;

aunque quizás quede mejor asegurarnos y podemos decir que nos quite cualquier blanco o carácter espacio del final:

$linea =~ s/\s*$//;

Otra opción sería, directamente, quitarlo:

chop $linea;

(siempre y cuando estemos seguros de que ese carácter molesto está en TODAS las líneas).

Lo interesante es saber qué carácter es. Con un editor hexadecimal como el khexedit o en consola, con el hexdump, lo puedes sacar fácilmente. Pero bueno, con el chop(), se arregla rápido.

(Yo sospecho de que se trata del carácter 13 (retorno de carro)).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carácter especial fin de línea

Notapor rafical » 2010-02-10 15:16 @678

Me parece que el carácter especial es el chr(10), pero no estoy seguro.

Pero ninguna de las sugerencias me funcionó. Te adjunto una imagen del archivo para que observes el carácter especial al que me refiero. Cuando el archivo le abro en el vim de Linux, el carácter especial se representa con '^@'.
Adjuntos
image.JPG
image.JPG (219.35 KiB) Visto 9857 veces
rafical
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-02-10 11:05 @503

Re: Eliminar carácter especial fin de línea

Notapor explorer » 2010-02-10 15:40 @694

Ahí no se ve nada. Ese cuadradito es solo la representación de la fuente de letras, indicando que se trata de un carácter del que no tiene un diseño.

Seguro que ese editor debe tener un visor en hexadecimal, y ahí podrás ver cuál es.

Dices que Vim te sale ^@. Podría ser entonces el chr(0).

Insisto en que con chop() lo arreglas, pero antes debes saber realmente cómo termina la línea.

Si, suponemos, que termina con un chr(0) seguido de un chr(10), pues puedes quitar los dos con

chomp $linea; # quita el avance de línea
chop $linea; # quita el 0


O con expresiones regulares (no probado):

$linea =~ s/\000\n$//;

Muy divertida la línea

$paramFile[7] =~ s/\x0d\0xa/' + Chr(13) + Chr(10) + '/;

¿Qué lenguaje es ese?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carácter especial fin de línea

Notapor rafical » 2010-02-10 17:12 @758

Revisando con un editor hexadecimal se observa que ese rectángulo representa a los caracteres chr(0), chr(13) y chr(10). Es decir que se debe eliminar esos caracteres.

Le probé con el chop($linea) pero tampoco me dio resultados. Entonces ¿¿cómo puedo eliminar esos caracteres al final de cada línea??

La línea que citas: $paramFile[7] =~ s/\x0d\0xa/' + Chr(13) + Chr(10) + '/; la encontré igual en algún foro de Perl.
rafical
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-02-10 11:05 @503

Re: Eliminar carácter especial fin de línea

Notapor explorer » 2010-02-10 17:16 @761

Bueno, pues si estás en un sistema Windows, haces las DOS líneas que te he puesto antes, y listo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
chomp $linea;  # quita los caracteres de final de línea
chop  $linea;  # quita el 0 final
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


O la expresión regular...

$linea =~ s/\000\r\n$//;

Bueno, como no tengo Windows, no estoy seguro de si es la correcta, pero yo probaría antes con

$linea =~ s/\000\n$//;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carácter especial fin de línea

Notapor rafical » 2010-02-10 17:46 @782

Excelente, ¡¡¡muchas gracias, explorer, por tu ayuda!!! :D
rafical
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-02-10 11:05 @503

Re: Eliminar carácter especial fin de línea

Notapor reLlene » 2013-01-17 15:20 @680

Revivo este hilo preguntando por lo mismo, quitar último (o últimos, por lo que veo) carácter de un binario que desde vim -b lo veo como ^M y mirando el mismo binario en hexadecimal se trata de 2 bytes, como ha dicho explorer más arriba, un salto de línea y un espacio vacío pareciera. El orden es 0x0d seguido de un 0x0a. y si los imprimo desde la terminal.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print chr(0x0d)
  2. # veo un blanco (no hay espacios)
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print chr(0x0a)
  2. # y aquí veo un salto de línea
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El punto es que estoy corriendo la siguiente línea que aquí del amigo explorer, que me la ha enseñado
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  perl -CO -pE 'use utf8; tr/\0x0a//;' archivobinario.txt > archivoresultante.txt
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y hecho esto, VUELVO a abrir el archivo con vim -b y sigo topándome con el ^M
También con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  perl -CO -pE 'use utf8; tr/\0x0d//;' archivobinario.txt > archivoresultante.txt
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o con las regexp que a continuación cito:

$linea =~ s/\000\r\n$//;

$linea =~ s/\000\n$//;


EDITO


He conseguido quitándole con la regexp

s/\n//g

pero es que al abrirlo nuevamente con vim -b sigo viendo el maldito ^M :oops: , aunque ésta vez TODO el texto está en una sola línea y vim abajo me dice "[no hay fin de línea]"

Luego le hago un hexdump a éste binario y veo que sigue allí el 0x0d, intento sacarlo con tr/\x0d// pero no hay caso, vuelvo a abrir vim -b archivo y sigue allí. Evidentemente me resta sacar éste para quitar el ^M ¿¿cierto?? :o
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Eliminar carácter especial fin de línea

Notapor explorer » 2013-01-17 16:33 @731

No te fíes del vim. En algunas instalaciones, el vim viene configurado para agregar un carácter de nueva línea al final de la última línea, en caso de que no exista ese carácter. Esto se hace así porque durante muchos años, los programadores cometían el error de no poner ese último carácter, y afectaba al funcionamiento de otros programas. Por eso, como esos programadores usaban vi (o vim), se puso esa condición al editor: agregar de forma incondicional un carácter así, si el archivo no lo tiene.

Lo que realmente cuenta es lo que diga el comando hexdump (u otros programas de volcado hexadecimal). Ni siquiera vale el comando vim -b.

Tienes que repasar el significado de los caracteres de fin de línea, pues suele indicar de dónde viene (de qué sistema operativo ha salido ese archivo).

Para quitar esos caracteres, hay que usar siempre chomp(). Solo habría que usar una expresión regular en caso de que estemos procesando un archivo que ha sido creado en un sistema operativo y se va a procesar en otro, en cuyo caso los caracteres de nueva línea son distintos entre sí (chomp() en un sistema no identificará los caracteres en el archivo creado en el otro).

También podemos usar la expresión regular

$texto =~ s/[\r\n]+//g;

que lo que hace es eliminar cualquier presencia de los caracteres Avance de línea y Retorno de carro.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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 1 invitado

cron