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 1, 2, 3  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Mensaje Lun Ago 27, 2007 11:08 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Convertir archivo .dat a SQL Responder citando

Necesito crear un programa que agarre un archivo 1234.dat (este archivo contiene una lista de parámetros) y quiero que lo transforme a .sql. Fácil, ¿no?...
Very Happy
¿Algún módulo, para hacer esto o algún norte...?
Mensaje Mar Ago 28, 2007 10:57 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Tu archivo .dat ¿cómo tiene los datos? Hasta no saberlo no te podríamos recomendar un módulo en especifico, sin embargo, quizá quieras checar el módulo Data::Table, a lo mejor tiene lo que buscas.

Saludos
Mensaje Mar Ago 28, 2007 12:00 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

Aunque sean una lista de parámetros, ¿cómo hay que hacer la consulta SQL? ¿hacer una query por parámetro? ¿Los parámetros son autoexcluyentes y se pueden agrupar con OR? ¿Forma cada parámetro una query o son todas para una sola? ¿Entre los parámetros se indica el campo(s) por el que se debe(n) hacer la query?
Mensaje Mie Ago 29, 2007 2:27 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Así es. El archivo .dat tiene datos, que yo genero. Tengo mi programa y recolecta datos, y vale, todo bien hasta que creo mi .dat pero ahora necesito agarrar esa info y meterla a la base de datos SQL o más bien convertir ese .dat en .sql Question y ahí es dónde me atoro...
Mensaje Mie Ago 29, 2007 2:35 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

Para meter información en la base de datos sólo tienes que ir ejecutando INSERT de la información del fichero dat.
Mensaje Mie Ago 29, 2007 3:58 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Así es. Serían en total 2 programas:
Programa 1: Agarra mi archivo.dat y lo convierte en .sql.
Programa 2 : Agarra el .sql y como dice explorer, lo inserta, automáticamente.

El objetivo de esto es tener temporales de uso, que quiere decir esto, que los archivos se crean y se guardan, y lo que hacen estos programas son 3 cosas:
leen, crean (.sql) e insertan, aquí la cosa es que no tengo muy clara la idea de sql en cuanto a tablas o formatos, no tuve problema al crear el .dat; tiene info como esta:
Código:
1234:encendido:ups:1234kbz
pero yo necesito guardar esto en .sql. para después insertarlo. Tengo la info de las tablas y donde se tiene que meter cada cosa, pero no encuentro el lazo entre estos 2 formatos, un .dat y un .sql.
Mensaje Mie Ago 29, 2007 4:14 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

¿No es complicarlo mucho? Se pueden hacer los 3 programas en sólo uno, sin tener que crear ficheros temporales. Incluso aunque quieras guardar los ficheros temporales para un uso futuro, también puedes hacerlo desde ese mismo programa.

En el tutorial de Uriel que hemos comentado en otro hilo hace bien poco está el mejor ejemplo: conexión e inserción de datos.
Mensaje Mie Ago 29, 2007 4:27 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

mmmmm Question mmm este,,,,, Confused

ok ok,,, deja le doy bien una leída al tutorial, por que incluso yo ya me perdí...
En sí la clave está en convertir, un .dat a un .sql... y ya lo demás a su tiempo. Creo que comenzaré con eso...

¿Alguna sugerencia? Question
Mensaje Mie Ago 29, 2007 4:43 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

He encontrado un ejemplo con DBD::CSV:

Perl:
    require DBI;
    my $dbh = DBI->connect("DBI:CSV:f_dir=/etc;csv_eol=\n;"
                           . "csv_sep_char=:;csv_quote_char=;"
                           . "csv_escape_char=");
    $dbh->{'csv_tables'}->{'passwd'} = {
        'col_names' => ["login", "password", "uid", "gid", "realname",
                        "directory", "shell"]
    };
    $sth = $dbh->prepare("SELECT * FROM passwd");
porque el formato del fichero passwd es igual que tu fichero dat. Pero repito... esto me parece que es complicarlo mucho.
Mensaje Mie Ago 29, 2007 4:56 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

Quizás la solución más sencilla, según lo que quieres, sea:
Código:
* abrir fichero .dat
* abrimos el fichero sql en escritura
* por cada línea del fichero
*   sacamos los campos, separando por ':'
*   creamos la sentencia INSERT con esos valores
*   pintamos la sentencia al fichero sql
* cerramos ficheros
pero lo propuesto por mí es:
Código:
* abro la conexión a la base de datos
* bucle de captura de datos
*   obtenemos los datos
*   insertamos los datos en la base de datos
* cerramos la conexión
Esto es factible si en la captura de datos tenemos tiempo para hacer el INSERT en la base. Si no es así (por ejemplo, por que obtenemos los datos a partir de una tarjeta capturadora de datos), entonces:
Código:
* bucle de captura de datos
*   obtenemos los datos
*   les guardamos en una estructura de datos, en memoria
* abro la conexión a la base de datos
* bucle por todos los datos capturados
*   insertamos los datos en la base de datos
* cerramos la conexión
Y, finalmente, si la captura de datos es tan delicada que no se puede hacer en Perl, entonces sí que hay que hacerlo con dos programas distintos, pero el segundo haría lo mismo que lo puesto en el ejemplo de escribir en el sql, pero realmente sin escribir en el sql, sino haciendo el INSERT en la base de datos.
Mensaje Mie Ago 29, 2007 5:03 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Gracias Explorer, pero sabes que mejor deja, planteo bien el problema por que ni yo mismo me estoy entendiendo. Deja, lo mastico y en cuanto tenga algo mejor planteado con lo que me mandaste les comento que onda... les dejo un ejemplo de la info que contiene mi .dat. Se llama 2007-8-29-17-54-0-spool.dat

Código:
1.0:POWERALERT 12=2.0:1.3.6.1.4.1.850.1=3.0:3075420=4.0:www.tripplite.com=5.0:Tripp Lite=6.0:1111 W. 35th St., Chicago IL, 60609=7.0:72=8.0:1388=9.1.2.1:1.3.6.1.2.1.1.9.1=9.1.3.1:The sysORTable capabilities are still being explored. It appears that the AGENT-CAPABILITIES macro in the MIB definitions should be used to generate these table entries. See RFC2580=9.1.4.1:1388=


Saludos
Mensaje Mie Ago 29, 2007 5:07 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

¿Eso no es SNMP?

En CPAN hay un centenar de módulos para ese protocolo...

Very Happy
Mensaje Mie Ago 29, 2007 5:17 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Efectivamente, la cosa es así, realicé un programa en Perl que lee las MIBS de un equipo y claro utiliza:
Perl:
use SNMP;
use snmpUtils;
use File::Copy;


y al final de leer las MIB las guarda en un .dat. Hasta ahí todo bien... pero necesito hacer un programa que en otra carpeta diferente que la que contiene los .dat se guarde la misma información pero ahora en sql, para que después alguien más haga un programa o lo que sea que tenga que hacer, para subir, esos .sql a la base de datos, digo no creo que sea solamente cambiarle la extensión. Lo que sea, si no que debe de tener algún formato que no conozco de un archivo .sql. Por tanto no puedo decir cómo es su estructura y he ahí donde se me complica la cosa, lo que me gustaría encontrar es algo que diga:

Aquí entra, no se, home/bin/2007-08-14-02.dat y aquí sale home/bin/sql/2007-08-14-02.sql

Very Happy
Mensaje Mie Ago 29, 2007 5:45 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4128
Ubicación: Valladolid, España
Responder citando

Lo dicho, se puede resolver todo el problema en veinte líneas.

Un fichero SQL realmente es un fichero de texto con las instrucciones SQL que el motor de la base de datos entiende. En tu caso, será un texto de la forma
SQL:
INSERT INTO tabla1 SET numero=1234, estado=encendido, tipo=ups, frec=1234kbz;
INSERT INTO tabla1 SET numero=1235, estado=encendido, tipo=ups2, frec=1242kbz;
INSERT INTO tabla1 SET numero=1236, estado=apagado, tipo=ups3, frec=124kbz;
y esto se hace así porque no te han encargado a ti meter los datos en la base de datos, porque entonces el programa queda un par de líneas más corto.

¡Ánimo!
Mensaje Mar Sep 04, 2007 10:31 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Very Happy
ya pude hacer la incerción pero a hora me topo con el sig problema,,,
necesito leer la base de datos listo
necesito guardar lo leido en un .da listo
mover este archivo a otra carpeta,, listo
pero a hora nesecito, leer ese archivo .da con la nueva info que se va a estar extrañendo ( por medio de un cron) y determinar si es = o diferente,
Si es = de queda el archivo tal cual. si es diferente, manda una alarma, ( no sobre escribe ese archivo .da, si no que crea otro)

( algo asi como un if, que dice, ok se creo un archivo = X1 pasa 1 minuto y se vuelve a crear otro archivo = X2 y se activa el if, si x1 = X2 , " el texto interno" no hace nada puesto q es =, pasa otro minuto se crea, ( o mas bien se lee) otro archivo X3 nuevamente se activa el if, pero en esta ocació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 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())
        {
              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 mas que nada para hacer las comparaciones de texto,, ( recordando que en el .dat la info se ve asi)
1:APODACA:1:172.26.2.127:Unico
2:APODACA:1:172.26.2.127:Unico
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos Todas las horas son GMT - 6 Horas
Ir a página 1, 2, 3  Siguiente
Página 1 de 3



Powered by phpBB © 2001, 2005 phpBB Group