Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Convertir archivo .dat a SQL
Ir a página Anterior  1, 2, 3  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Mensaje Mar Sep 04, 2007 10:54 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

No estaría demás que prestáramos un poco de atención al formateo del código, y a nuestra propia sintaxis española.

Para lo primero, cuestión de hacer una vista previa a enviar el mensaje (que siempre se puede volver a reeditar, más tarde). Recordar además que en Perl existe el perltidy que nos formatea el código gratuitamente.

Para lo segundo, es recomendable el uso de Firefox junto el diccionario de Español.

Finalmente, recuerdo a todos que esto es un foro, no un teléfono móvil.
Mensaje Mar Sep 04, 2007 12:15 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Question Confused Confused Question me quedé en las mismas...

¿Algo así como que mi código está algo revuelto? ¿o que digo demasiado sin ir al grano... Question
Mensaje Mar Sep 04, 2007 12:19 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

listo ya se pudo con

http://search.cpan.org/search?query=diff

Con esto comparo el texto.
Mensaje Mar Sep 04, 2007 12:35 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

No, lo que quiero decir es que tu mensaje debería parecerse a esto:

Very Happy

Ya pude hacer la inserción pero ahora me topo con el siguiente problema...

Necesito leer la base de datos: listo
Necesito guardar lo leído en un .dat: listo
Mover este archivo a otra carpeta: listo

Pero ahora necesito leer ese archivo .dat con la nueva información que se va a estar extrayendo (por medio de un cron) y determinar si es igual o diferente.

Si es igual, se queda el archivo tal cual.

Si es diferente, manda una alarma (no sobreescribe ese archivo .dat, si no que crea otro). Algo así como un if que crea un archivo llamado 'X1'. Pasa un minuto y se vuelve a crear otro archivo 'X2' y se activa el if: si X1 = X2 no hace nada puesto que son iguales. Pasa otro minuto, se crea, (o más bien se lee) otro archivo X3 nuevamente, se activa el if, pero en esta ocasión X1 es diferente de X3. Si esto pasa se crea un archivo Y2 y el sistema manda una alarma, pero no se borra X1).

Este es mi código:
Perl:
# Realizamos la etapa de preparación de la sentencia
my $sth = $dbh->prepare("SELECT idups,nombre,idsitio,ip,vendor,snmpro,modelo,estado,host,idcliente,usuario,password,fecha_add,fecha_kill,umbral_carga,trespaldo FROM ups;");

# Realizamos la etapa de ejecución de la sentencia
$sth->execute();

#------------------------------
# Realizamos la etapa de extracción de datos. Imprimimos dato a dato.
while ( @tupla=$sth->fetchrow_array()) {
    my $s = @tupla [0];
    my $s1 =@tupla [1];
    my $s2 =@tupla [2];
    my $s3 =@tupla [3];
    my $s4 =@tupla [4];
    my $s5 =@tupla [5];
    my $s6 =@tupla [6];

    # Para separar por : y guardar en una sola variable
    my $s7 ="$s:$s1:$s2:$s3:$s4:$s5:$s6";                     
    print "--------------\n";
    print "$s7\n";           

    open (Dat,">>$tabla.dat");
    print Dat "$s7\n$h";
    close(Dat);

    #-----------------------------------------------------------------
    my $file;
    open my $file, '<', "tabla.dat" or die("No se pudo abrir archivo");
    my $texto = do { local $/; <$file> };
    close $file;

    print "-------------------------------------\n";
    print $texto;


En la parte de leer el archivo es donde tengo problemas más que nada para hacer las comparaciones de texto... (recordando que en el .dat la información se ve así):
Código:
1:APODACA:1:172.26.2.127:Unico
2:APODACA:1:172.26.2.127:Unico
Mensaje Mar Sep 04, 2007 12:40 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Aunque habría algunas cosas que comentar en el código, como errores fatales de escritura (aunque funciona), si sólo te interesa saber si ha habido cambios entre ficheros, sin importar su contenido, valdría con comparar su tamaño (-s) y su fecha de modificación (-M), con lo que ni siquiera tendrías que leerlos.
Mensaje Mar Sep 04, 2007 1:03 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Como este foro lo van a ver más personas (y robots), reescribo aquí la parte de código publicado por Kiloko:
Perl:
# Realizamos la etapa de preparación de la sentencia
my $sth
    = $dbh->prepare(
      'SELECT '
    .     'idups, nombre, idsitio, ip, vendor, '
    .     'snmpro, modelo, estado, host, '
    .     'idcliente, usuario, password, fecha_add, '
    .     'fecha_kill, umbral_carga, trespaldo '
    . 'FROM '
    .     'ups; '
);

# Realizamos la etapa de ejecución de la sentencia
$sth->execute();

#------------------------------
# Realizamos la etapa de extracción de datos. Imprimimos dato a dato.
while ( @tupla = $sth->fetchrow_array() ) {

    # Para separar por : y guardar en una sola variable
    my $s7 = join ':', @tupla[0..6];                     
    print "--------------\n";
    print "$s7\n";           

    open  DAT,">>$tabla.dat";
    print DAT "$s7\n$h";
    close DAT;

    #-----------------------------------------------------------------
    my $texto = do {
        open my $file, '<', "tabla.dat" or die "No se pudo abrir archivo: $!";
        local $/;
        <$file>;
    };

    print "-------------------------------------\n";
    print $texto;
La forma my $s = @tupla [0];, aunque funcional, no es correcta, ya que, realmente, lo que estás haciendo en esa línea es adjudicar el primer elemento de la lista de valores devueltos por el array @tupla entre los elementos 0 y 0, a la variable escalar $s, que como ves, es demasiado complicado.

Realmente, lo que quieres es adjudicar el primer elemento de @tupla a $s, y eso se hace con my $s = $tupla[0]; (atención a los sigil),

Bueno, tu tranquilo que estas cosas se aprenden poco a poco...

Ultima edición por explorer el Mar Sep 04, 2007 2:49 pm, editado 1 vez
Mensaje Mar Sep 04, 2007 2:43 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Confused Algo raro pasa me marca un error aquí:

Perl:
    open  DAT,">>$tabla.dat");
    print DAT "$s7\n$h";
    close DAT;


y ya traté de cambiarlo por

Perl:
    open  (DAT,">>$tabla.dat");
    print DAT "$s7\n$h";
    close (DAT);


Pero a un así aparece el error.
Código:
syntax error at Ejemplo.pl line 45, near "open "
Execution of Ejemplo.pl aborted due to compilation errors.


Saludos...


Question
Mensaje Mar Sep 04, 2007 2:49 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

A ver ahora... he quitado el paréntesis del 'open'.

He hecho un perl -c y no me da fallos. Sólo falta por poner una '}' al final, pero tu tampoco la tenías puesta.
Mensaje Mar Sep 04, 2007 2:56 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Laughing Quién sabe qué pasó, pero ya no jala jajajaja, ah, que cosa, a ver, déjame darle una revisada nuevamente al código, al que tenía y al que pusiste a ver dónde está la falla...
Mensaje Mar Sep 04, 2007 3:45 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Laughing como que hoy PErl anda medio raro,, pues ya jala, asi quedo el codigo:

Perl:
#Realizamos la etapa de preparación de la sentencia
my $sth= $dbh->prepare(  'SELECT '
        .     'idups, nombre, idsitio, ip, vendor, '
        .     'snmpro, modelo, estado, host, '
    .     'idcliente, usuario, password, fecha_add, ' 
    .     'fecha_kill, umbral_carga, trespaldo '
    . 'FROM '. 'ups; ');
#Realizamos la etapa de ejecución de la sentencia
$sth->execute();
#Realizamos la etapa de extracción de datos. Imprimimos dato a dato.
while ( @tupla=$sth->fetchrow_array())
 {
        #Para separar por : y guardar en una sola variable
        my $s7 = join ':', @tupla[0..6];                     
    print "$s7\n";           
    open  DAT,">>$tabla.dat";
    print DAT "$s7\n$h";
    close DAT;
        my $texto = do
 {
 open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";
 local $/;
 <$file>; };
 #Creamos y movemos un archivo .dat que contiene la información requerida.
                my $oldlocation = "/home/ups/bin/$tabla.dat";
                my $newlocation = "/home/ups/config/$tabla.dat";
                move($oldlocation, $newlocation);
        }     
 #Realizamos la etapa de liberación de recursos ocupados por la sentencia
        $sth->finish();
#Nos desconectamos de la BD. Mostramos un mensaje si hay algun fallo
        $dbh->disconnect || warn "\nFallo al desconectar No es la ostia.\nError: $DBI::errstr\n";
#Terminamos
exit;


Al parecer el error estaba en los { }

PEro a hora el error que da es, si yo ejecuto el programa en la terminal aparece:

1:APODACA:0:123.45.6.789:Tripplite:SHCP2007AXTEL:
2:APODACA:1:123.45.6.789:Tripplite:SHCP2007AXTEL:

Y cuando se genera el .dat aparece:

2:APODACA:1:123.45.6.789:Tripplite:SHCP2007AXTEL:
2007-8-4-16-39

Falta la primera linea,, que raro,,

Por cierto en esta parte

Perl:
[syntax="perl"]my $texto = do
 {
 open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";
 local $/;
 <$file>; };
[/syntax:2b3f137883]

Quiero entender que es solo una alarma que alerta si el archivo no se pudo abrir, pero no comprendo del todo el local $/;

Voy a continuar revisando por que no sale la primera linea
por cierto estas ' no las tiene mi teclado,, generalmente uso ", pero por lo visto se puede reducir el numero de lineas,,,

Un saludo
Mensaje Mar Sep 04, 2007 3:59 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Yo desisto... no editaré más mensajes de Kiloko... Me he cansado. Sad
Mensaje Mar Sep 04, 2007 4:02 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

jajajaja ok ok sere mas conciso en mis mensajes, Razz
Mensaje Mar Sep 04, 2007 4:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

El 'local $/;' es algo así como crear una variable local (al contexto {} donde estamos), almacenando el antiguo valor de $/ en un sitio seguro para recuperarlo al final del contexto, y asignando a la nueva variable el valor indefinido (mucho para pocas letras).

El resultado es que el valor de '$/' fuera del contexto se mantiene, pero dentro, adquiere el valor indefinido, que tiene como efecto (in)definir el valor del separador de registros a la entrada.

Por defecto, ese valor es el del retorno de carro/nueva línea en el sistema operativo en que nos encontremos. De esa manera, hay leer desde un fichero, podremos leerlo línea a línea. Pero al indefinirlo, Perl lo leerá completamente (digamos que no encuentra un valor que marque fin de registro), por lo que nos devolverá el fichero entero, de una sola vez.

Por eso el resultado se guarda en un escalar, porque es todo el fichero en un solo valor.
Mensaje Mar Sep 04, 2007 4:15 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Kiloko escribió:
jajajaja ok ok sere mas conciso en mis mensajes, Razz
Yo no edito los mensajes para hacerlos más breves, sino para corregir el formateo de las secciones de código y citas. Y para corregir las faltas de ortografía, sintaxis, abreviaturas, anglicismos, etc.

No es para que quede bonito, sino para que Google nos ayude a atraer más usuarios.
Mensaje Mar Sep 04, 2007 4:27 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

OK enterado se que mi programación no es muy buena pero tratare de mejorar.
ya como ultimo.
Aqui esta el codigo final: con esto se soluciona el problema del .dat
En lo personal Trato de poner los { } más adelante, para no perder donde se cierra cada uno.


Perl:
#Realizamos la etapa de extracción de datos.
while ( @tupla=$sth->fetchrow_array())
{
    #Para separar por : y guardar en una sola variable
        my $s7 = join ':', @tupla[0..6];                     
        print "$s7\n";     
        open  DAT,">>$tabla.dat";
        print DAT "$s7\n";
        close DAT;
        my $texto = do
{       
        open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";local $/; <$file>;
 }
}


Saludos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos Todas las horas son GMT - 6 Horas
Ir a página Anterior  1, 2, 3  Siguiente
Página 2 de 3



Powered by phpBB © 2001, 2005 phpBB Group