Jue Jul 03, 2008 12:43 pm
|
 |
Kiloko
Perlero Adicto

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

Jue Jul 03, 2008 1:35 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4105
Ubicación: Valladolid, España
|
|
|
|
|
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 ); |
|
|
Jue Jul 03, 2008 3:22 pm
|
 |
Kiloko
Perlero Adicto

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

Jue Jul 03, 2008 6:31 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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
Ya solo falta insertar eso en la BD y VIVIRÁ, jejeje... mmm y claro, dividir los últimos resultados entre 8...
Por cierto, ¿cómo hago para que cuando divido no salga el punto decimal?
Que me lo redondee.
Lo que hago es
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. |
|

Vie Jul 04, 2008 1:38 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4105
Ubicación: Valladolid, España
|
|
|
|
|
El open() y el close() están descompensados.
Mueve la línea del open fuera del foreach. |
|
Lun Jul 07, 2008 10:00 am
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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 |
|
Lun Jul 07, 2008 10:41 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4105
Ubicación: Valladolid, España
|
|
|
|
|
| Yo creo que sí que es correcto... |
|

Jue Jul 24, 2008 2:14 pm
|
 |
Kiloko
Perlero Adicto

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

Powered by phpBB © 2001, 2005 phpBB Group
|