Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    9

    Confronto tra files di testo

    Salve a tutti,

    vorrei creare uno scriptino che faccia un confronto tra il contenuto di 2 files di testo di questo tipo:

    FILE 1:

    aaaa bbbb cccc dddd eeee
    1111 2222 3333 4444 5555
    xxxx xxxx xxxx xxxx xxxx

    FILE2:

    aaaa
    yyyy
    wwww

    Il confronto deve funzionare in questo modo:
    -verificare se in una qualsiasi riga del file 2 c'è qualche elemento che corrisponde ad un elemento di una qualsiasi riga del file 1 ed in caso affermativo riporta il contenuto (intero) della riga dove è avvenuta la corrispondenza del file 1 in un terzo fle di testo.

    Ho provato ad utizzare due cicli foreach annidati ottenendo il risultato voluto:

    open (TESTO1, "testo1.txt")||die "impossibile aprire testo1.txt:$!\n";
    open (TESTO2, "testo2.txt")||die "impossibile aprire testo2.txt:$!\n";
    open (TESTO_DEF, ">>testo_output.txt");
    @testo_confronto1=<TESTO1>;
    @testo_confronto2=<TESTO2>;
    close (TESTO1);
    close (TESTO2);

    foreach $linea(@testo_confronto1){
    foreach $line(@testo_confronto2){
    if ($linea=~m/$line/g){
    print TESTO_DEF "$line";
    }
    else{
    print "escluso:$linea\n";
    }
    }
    }
    close (TESTO_DEF);


    Mi chiedevo però se esiste una tecnica migliore per ottenere lo stesso risultato.
    Grazie 1000!

    zeno

  2. #2
    In generale si ottengono notevoli miglioramenti con:

    codice:
    open (TESTO1, "testo1.txt")||die "impossibile aprire testo1.txt:$!\n"; 
    open (TESTO2, "testo2.txt")||die "impossibile aprire testo2.txt:$!\n"; 
    open (TESTO_DEF, ">>testo_output.txt"); 
    
    while ($linea = <TESTO1>){ 
    while ($line = <TESTO2>){ 
    if ($linea=~m/$line/g){ 
    print TESTO_DEF "$line"; 
    } 
    else{ 
    print "escluso:$linea\n"; 
    } 
    } 
    } 
    
    close (TESTO1); 
    close (TESTO2); 
    close (TESTO_DEF);
    questo perchè si evita il caricamento dei file in memoria.

    Devi inoltre gestire i lock.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ho l'impressione che usando il comando "grep" del sistema operativo (linux) si ottimizzi ancora meglio: si usa un programma dedicato e compilato e gia` ottimizzato.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  4. #4
    anche se è difficile crederlo, pare che il motore delle RE di Perl sia molto più efficiente di grep e famiglia. L'ho letto su pubblicazioni molto serie.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.