• Publicidad

Cómo eliminar el 0A en una cadena de caracteres

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

Cómo eliminar el 0A en una cadena de caracteres

Notapor Hector Gutierrez » 2011-04-15 15:16 @678

Estoy trabajando con una cadena y tengo que introducir un 0D antes de una subcadena. Lo estoy haciendo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.               $desc =~ s/EVN/\015EVN/g;
  2.               $desc =~ s/PID/\015PID/g;
  3.               $desc =~ s/PV1/\015PV1/g;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


pero me coloca el 0D y luego el 0A he tratado de quitarlo mediante

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.               $desc =~ s/\x{0A}EVN/EVN/;
  2.               $desc =~ s/\x{0A}PID/PID/;
  3.               $desc =~ s/\x{0A}PV1/PV1/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero continua dejando el 0A, por cierto estoy trabajando en DOS.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Publicidad

Re: Cómo eliminar el 0A en una cadena de caracteres

Notapor explorer » 2011-04-15 15:58 @707

Bienvenido a los foros de Perl en español, Hector Gutierrez.

La expresión regular no hace nada más que lo que le pides. No está incluyendo un 0x0A después del 0x0D, sino que, a la hora de sacar $desc en pantalla o a fichero, Perl se da cuenta de que está en un sistema DOS, por lo que hace una traducción de los finales de línea, a ese formato. Es entonces donde agrega el 0x0A.

¿Puedes publicar un programa completo, pero pequeño, que intente reflejar lo que quieres hacer?

¿Qué versión de Perl tienes instalada?

Lo más probable es que puedas solventar el asunto con el uso de la función binmode().
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: Cómo eliminar el 0A en una cadena de caracteres

Notapor Hector Gutierrez » 2011-04-15 17:12 @758

Estoy utilizando ActivePerl 5.12.3 Build 1204, el sistema operativo de mi equipo es Windows Vista Home Premium

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use Net::Telnet ();
  3. use DBI;
  4. use Time::HiRes qw(usleep);
  5. #-----------------Parametros para la conexion con el SAHOS---------------------------------
  6. my $DB_NAME = "dbi:Pg:dbname=interfasehl7";
  7. my $DB_USER = "postgres";
  8. my $DB_PASS = "postgres";
  9.  
  10. #--------------------Parametros para conexion con el RIS-----------------------------------
  11. my $HOST = '192.9.101.6';
  12. my $PORT = 5003;
  13. my $SLEEP = '500_000';
  14. #-----------------------------my $start = "\x{11}";
  15. my $end = "\x{0D}\x{0A}";
  16. my $segment = "\x{0D}";
  17.  
  18. #--------------------Telnet y conexion al puerto del RIS-----------------------------------
  19.  
  20. #--------------------las 2 lineas de abajo las comente para hacer pruebas locales
  21. #--------------------my $t = new Net::Telnet (Telnetmode => 0);
  22. #--------------------$t->open(Host => $HOST, Port => $PORT) or die 'No se pudo conectar al puerto\n';
  23.  
  24. #---------------------------------Conexion al SAHOS----------------------------------------
  25. my $dbh = DBI->connect( $DB_NAME, $DB_USER, $DB_PASS ) or die "No se pudo lograr conexión";
  26.  
  27.  
  28. #----------------------Preparacion de la lectura del segmento creado del SAHOS-------------
  29. my $SQL_Code = 'select descripciondatos from tbdatos where llave = ?;';
  30. my $sth_lectura = $dbh->prepare($SQL_Code);
  31.  
  32. #------------------------Preparacion del Insert a la tabla de resultados-------------------
  33. $SQL_Code = 'insert into resultados(descripcion) values (?);';
  34.  
  35. my $sth_ins = $dbh->prepare($SQL_Code);
  36. my $index = 1;
  37.  
  38. #---------------- Obtenemos el numero de registros de la tabla de datos --------------------
  39.  
  40. $SQL_Code = "SELECT count(*) from tbdatos;";
  41. my $sth = $dbh->prepare($SQL_Code)             or die "No pude preparar la instrucción: $DBI::errstr";
  42. my $rc  = $sth->execute;
  43. if ($DBI::err) {
  44.     print "No pude ejecutar la instruccion: $DBI::errstr\n";
  45. }
  46.  
  47. #-------------- En este paso leemos los registros que nos trajo el sql----------------------
  48.  
  49. while ( my ($regs) = $sth->fetchrow_array) {    # aquí hacemos el ciclo de lectura de la consulta que solicitamos
  50.     for ($index=1;$index<=$regs;$index++) {
  51.          $sth_lectura->execute($index);
  52.           while ( my ($desc) = $sth_lectura->fetchrow_array) {    # aquí hacemos el ciclo de lectura de la consulta
  53.               print "TX=> $index,$desc\n";
  54.               $desc =~ s/EVN/\015EVN/g;
  55.               $desc =~ s/PID/\015PID/g;
  56.               $desc =~ s/PV1/\015PV1/g;
  57.  
  58.               $desc =~ s/\012//g;
  59.               $desc =~ s/\012//g;
  60.               $desc =~ s/\012//g;
  61.  
  62.               $desc = $desc . $end;
  63.  
  64. #--------------print "ESTA ES LA MODIFICACION...............FINAL=> $index,$desc\n";
  65.  
  66. #              $t->print("$desc");
  67. #              my ($respuesta) = $t->waitfor(-match => '/\x{0B}/',Timeout => 10, );
  68. #----------------------------my ($respuesta) = $t->waitfor(q(/\x{11}/));
  69.               $sth_ins->execute("$desc");
  70. #--------------print "AQUI RECIBIMOS LA RESPUESTA..................RX=> $desc\n";
  71.               usleep $SLEEP;
  72.           }
  73.     }
  74. }
  75.  
  76. # Con esta instrucción nos desconectamos de la Base de Datos
  77.  
  78. $dbh->disconnect();
  79. #------$t->close();
  80.  
  81.  
  82. # ----------Id: interfase_hl7.pl,v 1.0 2011/03/04 12:25 htgl09 ------------------------
  83. #-----------Id: Se agregaron los caracteres de control 0D antes de cada segmento y al final 0D y 0A
  84. #-----------Id: La respuesta comienza con 0B 2011/04/15 htgl09
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Las líneas de comentarios son para que funcione de manera local el programa, la cadena original es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
MSH|^~\&|HIS|HNEURO|RIS|HNEURO|20110415121903||ADT^A01|201104151219030001|P|2.3.1EVN||20110415121903PID|||07159551^^^HNEURO||TENORIO BARRIOS^MARIO||19800314|M|||DIAGONAL PLUTARCO ELIAS CALLES NO.17 BO. SAN BARTOLOME ^DISTRITO FEDERAL^TLAHUAC^SAN ANDRES MIXQUIC^     ^MEXICO||^^^^^^     25 94 81 56|^^^^^^      ||C|||^PV1||P|||||||||||||||||20110415121903
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y la idea es colocar 0x0D antes de las subcadenas EVN, PID y PV1 y al final un 0x0D y 0x0A.

Un datos más, instale el WinHex para ver la cadena de caracteres en hexadecimal y ahí me percaté que existía el 0x0A.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Cómo eliminar el 0A en una cadena de caracteres

Notapor explorer » 2011-04-15 17:49 @784

Con este pequeño programa, se demuestra que sale bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $desc = 'MSH|^~\&|HIS|HNEURO|RIS|HNEURO|20110415121903||ADT^A01|201104151219030001|P|2.3.1EVN|'
  7.          . '|20110415121903PID|||07159551^^^HNEURO||TENORIO BARRIOS^MARIO||19800314|M|||DIAGONAL '
  8.          . 'PLUTARCO ELIAS CALLES NO.17 BO. SAN BARTOLOME^DISTRITO FEDERAL^TLAHUAC^SAN ANDRES MIX'
  9.          . 'QUIC^     ^MEXICO||^^^^^^     25 94 81 56|^^^^^^     ||C|||^PV1||P|||||||||||||||||20'
  10.          . '110415121903'
  11.          ;
  12.  
  13. $desc =~ s/(EVN|PID|PV1)/\015$1/g;
  14. $desc .= "\015\012";
  15.  
  16. binmode STDOUT;
  17. print $desc;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo ejecutamos y lo pasamos por un visor hexadecimal:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> ./kk.pl|hexdump -C
  2. 00000000  4d 53 48 7c 5e 7e 5c 26  7c 48 49 53 7c 48 4e 45  |MSH|^~\&|HIS|HNE|
  3. 00000010  55 52 4f 7c 52 49 53 7c  48 4e 45 55 52 4f 7c 32  |URO|RIS|HNEURO|2|
  4. 00000020  30 31 31 30 34 31 35 31  32 31 39 30 33 7c 7c 41  |0110415121903||A|
  5. 00000030  44 54 5e 41 30 31 7c 32  30 31 31 30 34 31 35 31  |DT^A01|201104151|
  6. 00000040  32 31 39 30 33 30 30 30  31 7c 50 7c 32 2e 33 2e  |219030001|P|2.3.|
  7. 00000050  31 0d 45 56 4e 7c 7c 32  30 31 31 30 34 31 35 31  |1.EVN||201104151|
  8. 00000060  32 31 39 30 33 0d 50 49  44 7c 7c 7c 30 37 31 35  |21903.PID|||0715|
  9. 00000070  39 35 35 31 5e 5e 5e 48  4e 45 55 52 4f 7c 7c 54  |9551^^^HNEURO||T|
  10. 00000080  45 4e 4f 52 49 4f 20 42  41 52 52 49 4f 53 5e 4d  |ENORIO BARRIOS^M|
  11. 00000090  41 52 49 4f 7c 7c 31 39  38 30 30 33 31 34 7c 4d  |ARIO||19800314|M|
  12. 000000a0  7c 7c 7c 44 49 41 47 4f  4e 41 4c 20 50 4c 55 54  ||||DIAGONAL PLUT|
  13. 000000b0  41 52 43 4f 20 45 4c 49  41 53 20 43 41 4c 4c 45  |ARCO ELIAS CALLE|
  14. 000000c0  53 20 4e 4f 2e 31 37 20  42 4f 2e 20 53 41 4e 20  |S NO.17 BO. SAN |
  15. 000000d0  42 41 52 54 4f 4c 4f 4d  45 20 5e 44 49 53 54 52  |BARTOLOME ^DISTR|
  16. 000000e0  49 54 4f 20 46 45 44 45  52 41 4c 5e 54 4c 41 48  |ITO FEDERAL^TLAH|
  17. 000000f0  55 41 43 5e 53 41 4e 20  41 4e 44 52 45 53 20 4d  |UAC^SAN ANDRES M|
  18. 00000100  49 58 51 55 49 43 5e 20  20 20 20 20 5e 4d 45 58  |IXQUIC^     ^MEX|
  19. 00000110  49 43 4f 7c 7c 5e 5e 5e  5e 5e 5e 20 20 20 20 20  |ICO||^^^^^^     |
  20. 00000120  32 35 20 39 34 20 38 31  20 35 36 7c 5e 5e 5e 5e  |25 94 81 56|^^^^|
  21. 00000130  5e 5e 20 20 20 20 20 20  7c 7c 43 7c 7c 7c 5e 0d  |^^      ||C|||^.|
  22. 00000140  50 56 31 7c 7c 50 7c 7c  7c 7c 7c 7c 7c 7c 7c 7c  |PV1||P|||||||||||
  23. 00000150  7c 7c 7c 7c 7c 7c 7c 32  30 31 31 30 34 31 35 31  ||||||||201104151|
  24. 00000160  32 31 39 30 33 0d 0a                              |21903..|
  25. 00000167
  26. explorer@casa:~/Documentos/Desarrollo>
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
y ya ves que aparecen los caracteres 0x0d y 0x0a que queríamos.

El truco está en que, como voy a necesitar un print() para sacar el texto a pantalla (o al visor hexadecimal), para evitar que Perl traduzca los caracteres 0x0d a 0x0d0x0a (porque estamos en DOS), pongo un binmode STDOUT, para que el print() saque el texto tal cual está en memoria.
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: Cómo eliminar el 0A en una cadena de caracteres

Notapor Hector Gutierrez » 2011-04-15 18:37 @817

Realice los cambios el código quedo así:

use strict;
use warnings;
use diagnostics;
use Net::Telnet ();
use DBI;
use Time::HiRes qw(usleep);
#-----------------Parametros para la conexion con el SAHOS---------------------------------
my $DB_NAME = "dbi:Pg:dbname=interfasehl7";
my $DB_USER = "postgres";
my $DB_PASS = "postgres";

#--------------------Parametros para conexion con el RIS-----------------------------------
my $HOST = '192.9.101.6';
my $PORT = 5003;
my $SLEEP = '500_000';

#--------------------Telnet y conexion al puerto del RIS-----------------------------------

#--------------------las 2 lineas de abajo las comente para hacer pruebas locales
#--------------------my $t = new Net::Telnet (Telnetmode => 0);
#--------------------$t->open(Host => $HOST, Port => $PORT) or die 'No se pudo conectar al puerto\n';

#---------------------------------Conexion al SAHOS----------------------------------------
my $dbh = DBI->connect( $DB_NAME, $DB_USER, $DB_PASS ) or die "No se pudo lograr conexión";


#----------------------Preparacion de la lectura del segmento creado del SAHOS-------------
my $SQL_Code = 'select descripciondatos from tbdatos where llave = ?;';
my $sth_lectura = $dbh->prepare($SQL_Code);

#------------------------Preparacion del Insert a la tabla de resultados-------------------
$SQL_Code = 'insert into resultados(descripcion) values (?);';

my $sth_ins = $dbh->prepare($SQL_Code);
my $index = 1;

#---------------- Obtenemos el numero de registros de la tabla de datos --------------------

$SQL_Code = "SELECT count(*) from tbdatos;";
my $sth = $dbh->prepare($SQL_Code) or die "No pude preparar la instrucción: $DBI::errstr";
my $rc = $sth->execute;
if ($DBI::err) {
print "No pude ejecutar la instruccion: $DBI::errstr\n";
}

#-------------- En este paso leemos los registros que nos trajo el sql----------------------

while ( my ($regs) = $sth->fetchrow_array) { # aquí hacemos el ciclo de lectura de la consulta que solicitamos
for ($index=1;$index<=$regs;$index++) {
$sth_lectura->execute($index);
while ( my ($desc) = $sth_lectura->fetchrow_array) { # aquí hacemos el ciclo de lectura de la consulta

print "TX=> $index,$desc\n";

$desc =~ s/(EVN|PID|PV1)/\015$1/g;

$desc .= "\015\012";

binmode STDOUT;

$sth_ins->execute("$desc");

usleep $SLEEP;
}
}
}

# Con esta instrucción nos desconectamos de la Base de Datos

$dbh->disconnect();
#------$t->close();

# ----------Id: interfase_hl7.pl,v 1.0 2011/03/04 12:25 htgl09 ------------------------
#-----------Id: Se agregaron los caracteres de control 0D antes de cada segmento y al final 0D y 0A
#-----------Id: La respuesta comienza con 0B 2011/04/15 htgl09

Lo ejecuto y al ver el archivo en un editor hexadecimal me sigue presentado el 0x0D y luego el 0x0A anexo la imagen editor.
Adjuntos
editorhexa.jpg
editorhexa.jpg (195.34 KiB) Visto 1215 veces
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Cómo eliminar el 0A en una cadena de caracteres

Notapor explorer » 2011-04-15 18:40 @819

¿En dónde estás guardando la salida hacia el fichero?
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: Cómo eliminar el 0A en una cadena de caracteres

Notapor Hector Gutierrez » 2011-04-15 18:48 @825

Si, lo guardo en una tabla de paso como si fuera un log, la base de datos es postgres 8.2 estas son las especificaciones:
-- Table: resultados

-- DROP TABLE resultados;

CREATE TABLE resultados
(
descripcion character varying(500) NOT NULL,
llave smallint,
CONSTRAINT resultados_pkey PRIMARY KEY (descripcion)
)
WITHOUT OIDS;
ALTER TABLE resultados OWNER TO postgres;
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Cómo eliminar el 0A en una cadena de caracteres

Notapor explorer » 2011-04-15 18:56 @830

No he preguntado eso.

La pregunta es: para poder sacar la información en formato hexadecimal con el WinHex, debes, en algún momento, haber guardado la información en el fichero "prueba de hl7 en dsp-11.txt", bien desde la base de datos, o bien desde el programa.

¿Cómo lo has hecho?
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: Cómo eliminar el 0A en una cadena de caracteres

Notapor Hector Gutierrez » 2011-04-15 19:10 @840

Disculpa, el programa guarda la cadena en la tabla de PostgreSQL, abrí un bloc de notas, lo copié manualmente de la tabla al bloc de notas y después lo abrí con el editor hexadecimal.
Hector Gutierrez
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-04-15 14:49 @659

Re: Cómo eliminar el 0A en una cadena de caracteres

Notapor explorer » 2011-04-16 06:22 @307

Bien, pues estoy casi seguro que el responsable es el bloc de notas, pero podría ser también la operación de copiar y pegar.

Lo que sí puedes hacer, para estar seguro, es una de estas dos cosas.

  • abrir el fichero .txt y guardar allí la información, desde el propio programa
    .
  • veo en el código que haces un print() dentro del bucle, para sacarlo a pantalla. Puedes aprovecharlo: coloca el binmode STDOUT antes del bucle, y arranca el programa desde una ventana de MSDOS con una redirección al fichero de texto: programa > fichero.txt. Así, se grabará toda la salida en el fichero de texto.
    .
Si el programa no es interactivo (no te pide nada mientras se está ejecutando), la solución más rápida es la segunda. Si no, la primera funcionará en todas las ocasiones.
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

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 38 invitados