• Publicidad

Formateado de texto

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

Formateado de texto

Notapor VIK » 2006-12-06 18:27 @810

Hola.

Estoy conociendo el Perl ya que me lo recomendaron ampliamente, pero soy totalmente nuevo en este lenguaje.

Tengo un trabajo pendiente que me ha costado resolver. El problema es el siguiente: tengo 1 archivo de texto (llamado DSK061204MEX.txt) que contiene 14 registros con la siguiente estructura:
Código: Seleccionar todo
061204AJUSTES    00000001234567
061204INTERF       00000007895412

Ahora quiero incluir los 3 últimos caracteres del nombre del archivo al principio de cada registro es decir :
Código: Seleccionar todo
MEX061204AJUSTES    00000001234567
MEX061204INTERF       00000007895412

Ya programé un dir a la ruta donde reside este archivo y lo dejo en otra ruta donde se guarda el dato (se preguntaran porque hago esto, es porque el nombre cambia de acuerdo a la fecha, es variable):
Código: Seleccionar todo
DSK061204MEX.txt

Otra modificación pendiente es agregar un punto (.) a la cantidad que aparece al final del archivo, ya que no está formateado el dato y representa enteros con 2 decimales; lo que busco es esto:
Código: Seleccionar todo
MEX061204AJUSTES    000000012345.67
MEX061204INTERF       000000078954.12

Espero haber sido claro con mi narración y gracias por las atenciones que sirvan tener con su servidor.

Saludos
VIK
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-12-06 17:51 @785

Publicidad

Notapor explorer » 2006-12-06 20:08 @881

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

Esta es una posible solución
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$dir_origen  = '.';
$dir_destino = 'salida';

# Para todos los ficheros origen
foreach $fichero ( <$dir_origen/DSK*.txt> ) {

    ($nombre) = $fichero =~ /\/([^\/]+)$/;  # Nombre real del fichero

    # Tres últimas letras del fichero
    ($terminacion) = $nombre =~ /(...)\.txt/;
                                        # Se puede hacer con substr si estamos seguros
                                        # de que la longitud del fichero siempre es la misma:
    #$terminacion = substr($nombre,9,3);

    # Procesamos el fichero o pasamos al siguiente
    print "Procesando $nombre \n";
    open FICHERO, "<$fichero" or next;
    open SALIDA,  ">$dir_destino/$nombre" or next;
    while ( $linea = <FICHERO> ) {

        # Formateo de la línea
        $linea = $terminacion . $linea; # Le ponemos la terminación al principio
        substr($linea,-3,0) = '.';      # Insertamos el punto a cañón en esa posición

        print SALIDA $linea;
    }
    close SALIDA; close FICHERO;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Quizás la forma de introducir el punto decimal no sea muy ortodoxa, pero al menos funciona si estamos seguros de que el fichero siempre es del formato que nos dicen.

Tampoco es bonita la forma de obtener el nombre del fichero. Hubiera sido mejor usa File::basename.

Seguro que hay otro forista con una mejor solución.
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

Notapor VIK » 2006-12-07 12:23 @558

Hola tomando el ejemplo mi código quedo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$dir_origen  = 'd:\trabajo\as400\dsk.';
$dir_destino = 'salida';

# Para todos los ficheros origen
foreach $fichero ( <$dir_origen/DSK*.txt> ) {

    ($nombre) = $fichero =~ /\/([^\/]+)$/;  # Nombre real del fichero ¿que significa lo que vienes despues de la variable $fichero?

    # Tres últimas letras del fichero
    $terminacion = substr($nombre,9,3);

    # Procesamos el fichero o pasamos al siguiente
    print "Procesando $nombre \n";
    open FICHERO, "<$fichero" or next;
    open SALIDA,  ">$dir_destino/$nombre" or next;
    while ( $linea = <FICHERO> ) {

        # Formateo de la línea
        $linea = $terminacion . $linea; # Le ponemos la terminación al principio
        substr($linea,-3,0) = '.';      # Insertamos el punto a cañón en esa posición

        print SALIDA $linea;
    }
    close SALIDA; close FICHERO;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Corrí el programa e hizo los cambios la primera vez, pero después no pude repetir la acción, este programa lo estoy corriendo en un equipo con Windows 2003 Server...

Gracias por su ayuda
VIK
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-12-06 17:51 @785

Notapor explorer » 2006-12-07 12:32 @564

Cambia
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open FICHERO, "<$fichero" or next;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open FICHERO, "<$fichero" or print "Error al abrir $fichero: $!\n" and next;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y nos dices el tipo de error que sale en pantalla.

Haz lo mismo para SALIDA:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open SALIDA,  ">$dir_destino/$nombre" or print "Error: no pude escribir a $dir_destino/$nombre: $!\n" and next;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Notapor VIK » 2006-12-07 13:06 @587

Ok perdón.

Ya lo solucioné. Cambié la ruta de salida y ahora deposito los nuevos archivos ahí :oops:

Gracias por tu atención.
VIK
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2006-12-06 17:51 @785


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado