Perl en Español

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

De fechas y SQL

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Jue Jul 03, 2008 12:43 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 232
Ubicación: MOnterrey NL
De fechas y SQL Responder citando

Buen día, perleros, ando algo atorado con un programa. Sé que es algo muy básico, pero ando algo bloqueado y me gustaría saber su opinión y si me pueden dar algún tip. Se los agradecería. Smile

Mi primer duda es: tengo esta parte en mi programa:
Perl:
foreach $x (@resultado)
    {
     print "$x\n";
     open (dir, ">>$h.txt");
     print dir "$h=$x\n";
     close(dir);
    }


En donde $h = "fecha" y donde @resultado corresponde a una lista de la siguiente forma:
Código:
1001.1=1543
1001.2 = 15354
... hasta llegar al 1009.99=1545


Y necesito buscar el valor que sea igual a 1008.1= 215884.

Mi llave sería 1008.1 y lo que viene después de '=' sería X porque siempre cambia; en pocas palabras, un filtro para guardar en el archivo fecha.txt.

La segunda duda es un programa que tome este archivo txt y lo convierta en una secuencia de SQL, y que lo inserte en una BD.

jejeje y listo... si me pueden echar la mano se los agradecería.

SAludos
Mensaje Jue Jul 03, 2008 1:35 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3823
Ubicación: Valladolid, España
Responder citando

Para lo primero creo que es esto:
Perl:
open (dir, ">>$h.txt");
foreach $x (@resultado) {
    next if $x !~ /^1008\.1\s*=\s*(.+)/;
    print "$x\n";
    print dir "$h=$x\n";
}
close(dir);
Mensaje Jue Jul 03, 2008 3:22 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 232
Ubicación: MOnterrey NL
Responder citando

Excelente, jejeje, te juro que me tardé como una hora y nada más no se me prendía el foco, hice todo un show con split, jejeje,
Pues bien mi archivo sale:
fecha
2008-05-06=1008.1:21584

Ahora necesito que se quite el 1008.1: y solo salga el dato 21584.

Lo logré así:
Perl:
foreach $x (@resultado)
 {
    next if $x !~ /^1008\.1\s*:\s*(.+)/;
    open (dir, ">>$h.dat");
    $linea= ( split /:/, $x )[1];
    print "$h=311879=464=$linea\n";
    print dir "$h=311879=464=$linea\n";
}
close(dir);


Ahora necesito hacer lo mismo con el siguiente dato pero que se inserte al final... ¿alguna idea?

Question
Mensaje Jue Jul 03, 2008 6:31 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 232
Ubicación: MOnterrey NL
Responder citando

Pues lo he conseguido, mi Frankeinstein ya casi vive... ahí está el código... (se aceptan comentarios)

Perl:
foreach $x (@resultado)
 {
    next if $x !~ /^1008\.1\s*:\s*(.+)/;
    $linea= ( split /:/, $x )[1];
}
##-----------------------------------------------------------------------
foreach $x2 (@resultado2) {
    next if $x2 !~ /^1008\.1\s*:\s*(.+)/;
    open (dir, ">>$h.data");
    $linea2= ( split /:/, $x2 )[1];
    print "$h=311879=464=$linea=$linea2\n";
    print dir "$h=311879=464=$linea,$linea2\n";
}
close(dir);


Al final esto es lo que sale:

2008-07-03-18=311879=464=608780=134818

Very Happy

Ya solo falta insertar eso en la BD y VIVIRÁ, jejeje... mmm y claro, dividir los últimos resultados entre 8... Rolling Eyes

Por cierto, ¿cómo hago para que cuando divido no salga el punto decimal?
Que me lo redondee.
Lo que hago es
Código:
$l = $linea
en mi programa anterior y me sale
Código:
2008-07-03-36=311879=464=3497.5=11323.625

¿Cómo hago para redondear?
SAludos

jejeje, no cabe duda que la mejor programación sale en la noche y justo a la hora de salir del talejo (trabajo).
http://perlenespanol.baboonsoftware.com/foro/viewtopic.php?t=1429&highlight=redondear+enteros

Ahí está el hilo para redondear y quitar el punto decimal.
Mensaje Vie Jul 04, 2008 1:38 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3823
Ubicación: Valladolid, España
Responder citando

El open() y el close() están descompensados.

Mueve la línea del open fuera del foreach.
Mensaje Lun Jul 07, 2008 10:00 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 232
Ubicación: MOnterrey NL
Responder citando

Pues parece que ya he terminado pero tengo algunas dudas, de números que no me cuadran, mi problema es el siguiente:
yo tengo mi dato $X el cual es un octeto; primero lo trasformo en bits, lo multiplico por 8.

Y ahora necesito meter esos datos en una gráfica para que sean bits*seg. en un rango de tiempo de 5 min.

Lo que hice fue tomar el primer dato $X y el dato que se guardó hace 5 min, $X5 y hacer la siguiente operación $X5 -$X.

Y de lo que resulte, dividirlo entre 300 (5min, en segundos).

Y ese dato insertarlo en la gráfica cada 5min y al pasar el tiempo, la gráfica me mostrará los bits, por seg. obtenidos de $X. Como ven... ¿estoy en lo correcto?

SAludos
Mensaje Lun Jul 07, 2008 10:41 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3823
Ubicación: Valladolid, España
Responder citando

Yo creo que sí que es correcto...
Mensaje Jue Jul 24, 2008 2:14 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 232
Ubicación: MOnterrey NL
Responder citando

Efectivamente mi buen explorer, es correcto
y el código final quedo así

Perl:

use lib "/bin/lib";
use snmpUtils;          # uso de modulos en Windows y Unix
use File::Copy
use POSIX;
#**************************************************
my $h = strftime("%Y-%m-%d-%H-%M", localtime);
#**************************************************
# OID Solicitadas:
my $received15="1.3.6.1..1.2.4.1.8";
my $trasmitted15 ="1.3.6.1.2.4.1.5";
     #Description:    The number of transmitted (8-bit) octets
#------------------------------------------------
$IpEquipo = "1.2.3.54.21";
$Comunidad = "local" ;
#------------------------------------------------
   $snmp = sprintf( "%s\@%s:::::2",$Comunidad,$IpEquipo);
   $snmp2 = sprintf( "%s\@%s:::::2",$Comunidad,$IpEquipo);
#------------------------------------------------
         @mibs = ($received15);
         @mibs2 = ($trasmitted15);
#------------------------------------------------
         @resultado=snmpUtils::walk($snmp, @mibs);
         @resultado2=snmpUtils::walk($snmp2, @mibs2);
#-------------------------------------------------     
  foreach $x (@resultado)
 {
    next if $x !~ /^1008\.2\s*:\s*(.+)/;
    $primero= ( split /:/, $x )[1];     
 }
open (dir, ">>$h.data");
 
  foreach $x2 (@resultado2)
  {
    next if $x2 !~ /^1008\.2\s*:\s*(.+)/;
    $primero2= ( split /:/, $x2 )[1];
   }

  my $I= $primero*8;
  my $I2= $primero2*8;

    my $divisor = 900;
    $l( split(/\./, $I/$divisor) )[0];
    $l2 = ( split(/\./, $I2/$divisor) )[0];

 print "$h=$l=$l2=0\n";
 print dir "$h=$l=$l2=0\n";

close(dir);
    $oldlocation = "/us/bin/$h.data";
    $newlocation = "/us/data/$h.data";
    move($oldlocation,$newlocation);       
exit(0);
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group