Lun Ago 27, 2007 11:08 am
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
| Convertir archivo .dat a SQL |
|
|
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?...
¿Algún módulo, para hacer esto o algún norte...? |
|
|
|
Mar Ago 28, 2007 10:57 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1366
Ubicación: México
|
|
|
|
|
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 |
|
Mar Ago 28, 2007 12:00 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
| 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? |
|
Mie Ago 29, 2007 2:27 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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 y ahí es dónde me atoro... |
|
Mie Ago 29, 2007 2:35 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
| Para meter información en la base de datos sólo tienes que ir ejecutando INSERT de la información del fichero dat. |
|

Mie Ago 29, 2007 3:58 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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. |
|

Mie Ago 29, 2007 4:14 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
¿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. |
|
Mie Ago 29, 2007 4:27 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
mmmmm mmm este,,,,,
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?  |
|
Mie Ago 29, 2007 4:43 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Mie Ago 29, 2007 4:56 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Mie Ago 29, 2007 5:03 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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 |
|
Mie Ago 29, 2007 5:07 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
¿Eso no es SNMP?
En CPAN hay un centenar de módulos para ese protocolo...
 |
|

Mie Ago 29, 2007 5:17 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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
 |
|

Mie Ago 29, 2007 5:45 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4008
Ubicación: Valladolid, España
|
|
|
|
|
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! |
|

Mar Sep 04, 2007 10:31 am
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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 |
|

Powered by phpBB © 2001, 2005 phpBB Group
|