Aquí sigo aprendiendo de este lenguaje y creo que no tengo claras las cosas porque las complico demasiado
Voy a contar mi nuevo problema (a ver si lo consigo).
Tengo dos ficheros de entrada ambos con el siguiente formato pero con diferente número de líneas:
Fichero1 (sin repeticiones)
codigonumericoA1, nombreA1, codigonumericoB1, nombreB1
codigonumericoA2, nombreA2, codigonumericoB2, nombreB2
codigonumericoA3, nombreA3, codigonumericoB3, nombreB3
Fichero2 (sin repeticiones)
codigonumericoC1, nombreC1, codigonumericoD1, nombreD1
codigonumericoC2, nombreC2, codigonumericoD2, nombreD2
Primero debo buscar el valor del tercer campo de cada linea del primer fichero (nombreB1, nombreB2, nombreB3, etc) en el segundo fichero y entonces sustituir el valor codigonumericoB1, codigonumericoB2, etc. por el correspondiente del fichero 2 (codigonumericoD1, o codigonumericoD2, etc.). No sé si me he podido explicar correctamente...
Una vez sustituido quiero volcarlo en un fichero de salida de forma que quedaría así:
Fichero salida
codigonumericoA1, nombreA1, codigonumericoCORRESPONDIENTE, nombreB1
codigonumericoA2, nombreA2, codigonumericoCORRESPONDIENTE, nombreB2
De momento y tras mucho darle vueltas (seguro que existe un modo más sencillo de hacerlo), he conseguido comparar los nombres (nombreB1 y nombreD1) y si coinciden, sustituir el valor del código correspondiente del fichero2, pero el problema lo tengo cuando quiero volcar la información en un nuevo fichero.
Aquí mi (locura) código:
Using perl Syntax Highlighting
- #!/usr/bin/env perl
- use strict;
- use autodie;
- use diagnostics;
- use warnings;
- my @CRC; #Array de líneas del fichero2
- my @codigo; #Array de líneas del fichero1
- my @guardar; #Array donde guardo los nombres de centro de fichero1
- my @codDep; #Array donde guardo el código centro a sustituir
- my @sustituir; #Array donde guardo el par código, nombre centro de fichero1
- my @otro; #Array donde guardo el nombre de centro de fichero2
- my @valor; #Array donde guardo el código de centro que quiero
- my @save; #Array donde guardo el par código, nombre_centro de fichero2
- open my $ENTRADA, '<', "fichero1.txt";
- open my $OTRO, '<', "fichero2.txt";
- open my $SALIDA, '>', "salida.txt";
- while (my $linea = <$ENTRADA>) {
- chomp $linea;
- @codigo = split /,/, $linea;
- my $elem = "$codigo[3]\n";
- my $ct = "$codigo[2],$codigo[3]\n";
- push @sustituir, $ct; #array con el par código centro, nombre
- push @guardar, $elem; #array con solo los nombres de centros
- }
- while (my $linea = <$OTRO>) {
- chomp $linea;
- @CRC = split /,/, $linea;
- my $nombre_CT = "$CRC[3]\n";
- my $elem2 = "$CRC[2],$CRC[3]\n";
- push @save, $elem2; #Tengo el par código, nombre
- push @otro, $nombre_CT; #Tengo el nombre del centro del fichero2
- }
- my $cosa = scalar(@save);
- my $contador = 0;
- for (my $i=0; $i < $cosa; $i++) {
- if (grep {$_ eq $otro[$i]} @guardar) {
- @valor = split /,/, $save[$i];
- print "\n Codigo a sustituir de fichero2 $valor[0]\n"; #valor que quiero
- print "Nombre del centro de fichero2 $valor[1]";
- #####Ahora quiero sustituir
- my $j = 0;
- foreach (@sustituir) {
- @codDep = split /,/, $sustituir[$j];
- $j++;
- if ($codDep[1] eq $valor[1]) {
- print "Código centro del fichero1 $codDep[0]\n";
- print "Nombre centro del fichero1 $codDep[1]";
- $codigo[2] = $valor[0]; #sustituimos el valor del código
- print "Valor $codDep[0] ya sustituido por $codigo[2] \n";
- print $SALIDA join(',', @codigo), "\n";
- }
- }
- $contador++;
- }
- }
- print "Coincidencias totales $contador de $cosa\n";
- close $OTRO;
- close $ENTRADA;
- close $SALIDA;
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
El fichero de salida sale con el codigonumericoB1, B2, B3, etc., cambiado, pero el resto de campos son siempre el mismo. De hecho los de la última fila del fichero1. Sé que es porque en @codigo se ha quedado almacenada la última línea tras terminar de leer el primer fichero, pero he intentado varias cosas para que cambie también el resto de campos y no lo consigo.
¿Me he explicado bien? ¿Alguna idea?
¡Muchas gracias por adelantado!