Josmanue escribiste:¿por que sacas el valor de "#x" antes de recorrer los campos? ese es un campo más que también hay que insertarlo en el campo correspondiente en la base de datos. ¿Es porque el simbolo # puede dar problemas?
No, es porque es muy distinto de la forma en la que voy a buscar el resto de campos, que sí siguen la regla de estar formados por 3 letras mayúsculas y algo más. Empiezo averiguando ese dato pero lo podría haber hecho también al final (el valor de $trama no cambia en todo el programa).
Josmanue escribiste:Bueno y la expresión regular "[^A-Z]+" la he cambiado por "[^0-2]" ya que en este campo sólo hay dos valores posibles 0 ó 2 y como sólo es un caracter no necesito el signo "+" ¿no?
A ver... si SÓLO va a aparecer el carácter '0' o el '2' detrás del '#', entonces la expresión regular es esta: "/^#(0|2)/".
Josmanue escribiste:Por otro lado, ¿¿para que en el bucle separe en $campo y $valor no es necesario que trama sea una matriz asociativa?? es decir, ¿tendría que ser %trama en lugar de $trama? ¿¿o al menos podría cambiarse a %trama?? Lo digo porque creo que sería más fácil (creo) a la hora de insertar los campos en la base de datos decirle que, por ejemplo, en el campo Fecha de la BD inserte $trama{"FEC"} que sería directamente el valor de FEC. Vamos si es que me he enterado bien de cómo funcionan las matrices asociativas.
Bueno, pero es que mi programa no hace todo
Efectivamente, la forma más fácil sería poniendolo en memorias asociativas, pero antes miraría cómo es la forma en que lo voy a pasar a la base de datos. Si se trata sólo de construit un 'INSERT' entonces sí.
Antes un recordatorio. $trama es donde está la trama que nos ha pasado el usuario por la entrada estándar, así que no la cambiamos. Lo que sí podemos hacer es crear una nueva variable llamada %trama donde guardaremos los campos que vamos encontrando.
Quedaría algo así:
- Código: Seleccionar todo
while ( $trama =~ /($campos)/g ) {
print "$1";
($campo, $valor) = unpack( "A3 A*", $1);
print "\t$campo\t$valor";
$trama{$campo} = $valor;
}
y luego, a la hora de crear la instrucción sql:
- Código: Seleccionar todo
$sql = 'INSERT INTO tabla SET ';
$sql .= join( ', ', map { "$_ = \'$trama{$_}\'" } keys %trama );
$sql .= ';';
que convierte la trama de ejemplo en:
INSERT INTO tabla SET LON = 'xxxx,xxxx', SLA = 'x', SLO = 'x', UID = 'xxxxx', LAT = 'xxxx,xxxx', ALT = 'xxxxx', TIE = 'xxxxxx', FEC = 'xxxxxx';
Quizás es difífil de ver lo que hace la línea join-map-keys, pero voy a tratar de explicarlo:
* En %trama tenemos los valores apuntados por sus respectivos campos.
* Como no nos importa el orden de salida de los campos/valores, uso
keys para sacar los nombres de los campos.
* Esos campos van 'entrando' en el
map, que va 'mapeandolos' (de ahí su nombre
) cada uno a una cadena de caracteres. En esa cadena de caracteres, la variable $_ guarda el valor del campo que nos ha entregado 'keys'. Entonces, como tenemos el valor del campo en $_, también tenemos acceso a su valor, que está en $trama{$_}. Usamos estos dos datos para construir la cadena de caracteres.
* El resultado de 'map' es un array o lista de varias cadenas de caracteres (todas de la forma "campo = 'valor'"). Bueno, pues con el
join, las juntamos todas uniéndolas con ", ".
Josmanue escribiste:Teniendo en cuenta el formato del campo LATxxxx,xxxx donde las x´s son: GGMM,mmmm
GG:grados
MM:minutos
mmmm:décimas de minutos
Y LONxxxxx,xxxx donde las x´s son: GGGMM,mmmm
Tengo que calcular los campos:
$Latitud_Grados = (GG + MM/60 + mmmm/600000);
y
$Longitud_Grados = (GGG + MM/60 + mmmm/600000);
¿Se te ocurre algo para hacerlo? ¿Habría que separar el campo en GG, MM y mmmm y después calcularlo no?
Sí, hay que separarlos. Eso se puede hacer en el bucle while:
- Código: Seleccionar todo
while ( $trama =~ /($campos)/g ) {
print "1:$1";
($campo, $valor) = unpack( "A3 A*", $1);
print "\t$campo\t$valor";
if ( $campo eq 'LON' or $campo eq 'LAT' ) {
($GG,$MM,$mmmm) = $valor =~ /(...?)(..),(....)/; # Los grados puedes ser dos o tres cifras
$valor = $GG + $MM/60 + $mmmm/600_000;
}
$trama{$campo} = $valor;
}
Josmanue escribiste:Ah! y una cosita más en el bucle, se guarda en la variable $1 por defecto ¿no?
Por defecto, no. La variable $1 'aparece' por efecto de los paréntesis que hay en la expresión regular en el while. Lo que hace es guardar 'lo que han encontrado esos paréntesis'. Si existieran otro par de paréntesis, podría 'aparecer' la variable $2, y así.