Tengo dos archivos de texto que contengan la siguiente:

FILE1.txt

dog
cat
antelope

FILE2.txt

1
2
Barry

La salida de los que quiero lograr es la siguiente:

dog1
dog2
dogBarry
cat1
cat2
catBarry
antelope1
antelope2
antelopeBarry

De la manera en que me han pasado sobre ella:

    open (FILE1, "<File1.txt") || die $!;
    open (FILE2, "<File2.txt") || die $!;

    my @animals = (<FILE1>);  #each line of the file into an array
    my @otherStrings = (<FILE2>);   #each line of the file into an array

    close FILE1 || die $!;
    close FILE2 || die $!;

    my @bothTogether;
    foreach my $animal (@animals) {
    chomp $animal;
            foreach my $otherString (@otherStrings) {
                    chomp $otherString;
                    push (@bothTogether,  "$animal$otherString");
            }
   }
   print @bothTogether; 

La forma en que me han hecho obras, pero estoy seguro de que no es la mejor manera de ir sobre él especialmente cuando los archivos podrían contener miles de líneas?

Cuál sería la mejor manera de hacerlo que ser, tal vez de usar un hash?

  • Si los archivos son demasiado grandes para la memoria, sólo se puede leer mientras se está procesando (y no antes, como lo hace ahora). Hashes no va a ayudar, porque había cargar todo en memoria de todos modos; y el procesamiento de «foreach» de todos modos.
  • Sólo una nota, también puede: my @animals = chomp(<FILE1>);
  • También creo que el script va a estar bien memorywise, porque sólo el archivo resultante será grande, y escribe línea por línea.
InformationsquelleAutor perl-user | 2013-02-06

2 Comentarios

  1. 5

    Su enfoque funciona bien para los archivos con miles de líneas. Que realmente no es grande. Para millones de líneas, podría ser un problema.

    Sin embargo, podría reducir el uso de memoria de su código sólo por la lectura de un archivo en la memoria, así como la impresión de los resultados inmediatamente en lugar de almacenarlos en un array:

    use warnings;
    use strict;
    
    open my $animals, '<', 'File1.txt' or die "Can't open animals: $!";
    open my $payloads, '<', 'File2.txt' or die "Can't open payloads: $!";
    
    my @payloads = <$payloads>;   #each line of the file into an array
    close $payloads or die "Can't close payloads: $!";
    
    while (my $line = <$animals>) {
        chomp $line;
        print $line.$_ foreach (@payloads);
    }
    close $animals or die "Can't close animals: $!";

    Con dos enormes archivos de igual tamaño, este será el uso más o menos 1/4 de la memoria de su código original.

    Actualización: también he editado el código para incluir Simbabque buenas sugerencias para su modernización.

    Actualización 2: Como otros han señalado, se podía leer ni archivo en la memoria, pasando a través de las cargas de archivo línea por línea en cada línea de los animales de archivo. Sin embargo, de que sería mucho más lento. Se debe evitar a menos que sea absolutamente necesario. El enfoque que he sugerido será de aproximadamente la misma velocidad que su código original.

    • Usted puede ser capaz de ayudar con otra de mis preguntas relacionadas con este uso de su código, la única pregunta sin respuesta en mi perfil, gracias
  2. 1

    Además de ciertos Moderno Perl aspectos (de dos argumentos open por ejemplo) el código es bastante sencillo.

    La única mejora que veo es que usted puede mover el interior chomp en un ciclo extra, tal vez hacer la muerde mientras usted lee el archivo. Que iba a ahorrar un poco de tiempo. Pero a pesar de todo, si quieres hacer algo con los datos de cada fila de algunos otros datos, lo estás haciendo bien.

    Debe utilizar or die en lugar de || die porque de precedencia, y el resultado final será una larga línea porque no hay más puedes incluir varias líneas en el de la matriz de elementos.

    Actualización: @FrankB hizo una buena sugerencia su comentario de arriba: Si los archivos son muy grandes, y usted está luchando con la memoria que no debe sorber ellos y los puso en las dos matrices, pero en lugar de leer y el proceso de la primera línea por línea, y abrir y leer el segundo para cada uno de estos primero de líneas. Que tarda un poco más, pero se ahorra una tonelada de memoria. A continuación, salida directamente los resultados, así en vez de empujar en los resultados de la matriz.

    • gracias por la parte superior o || precedencia, se dieron cuenta de mi error. Usted también puede ser capaz de ayudar con otra de mis preguntas es la única pregunta sin respuesta en mi perfil, gracias

Dejar respuesta

Please enter your comment!
Please enter your name here