[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: separare un file di testo



On Fri, 17 Jun 2005 13:50:16 +0200 Fernando Figaroli wrote:

> ho un file ... di testo unico .. che è stato creato dall'unione di più
> file di testo...
> 
> vorrei separarli sapendo che:
> 
> 1- il testo di ogni file inizia con " e termina con " 2- il nome del file
> è la prima riga..
> 

Qui sotto trovi una possibile soluzione in perl.
Legge i dati dal file "testounico.txt" e scrive nella directory corrente.

====
#!/usr/bin/perl -w

my $infile="testounico.txt";  # filename di ingresso
my $outfile="";    # filename in uscita
my $titolo=1;      # =1 durante lettura titolo 
my $buffer="";     # buffer testo da scrivere
my $ch;            # char letto
my $new=0;         # =1 durante lettura testo
my $i;
my $tmpname;

open(UNICO, $infile) or die "Non posso aprire $infile!";
  while(read(UNICO,$ch,1)) {
  if ($new == 0) {
        if ($ch eq "\"") {
                # trovata " di inizio nuovo testo
                $new = 1; $buffer = ""; $outfile = ""; $titolo = 1 
        };
  } else {
        # qui stiamo all'interno di un testo
        if ($ch eq "\"") { 
                # fine testo: ritocca il filename
                $outfile =~ tr/\ \//_/;
                $outfile .= ".txt";
                # se $outfile esiste gia, prova ad appendere .1, .2 , ecc.
		$tmpname = $outfile; $i=1;
                while (stat($tmpname) == 1) {
                   $tmpname = $outfile . ".$i";
                   $i++;
                }
                $outfile = $tmpname;
                $new = 0;
                # scrive il file
                open(OUTFILE,"> $outfile") 
		  or die "Non posso aprire $outfile!"; 
                print OUTFILE $buffer; close OUTFILE;
        } elsif ($ch eq "\n") {
                # fine titolo
                $titolo = 0; $buffer .= $ch;
        } else {
                # accoda il prox carattere al buffer testo/titolo 
                $buffer .= $ch;
                if ($titolo == 1) { $outfile .= $ch; }
        }
  }
                
}

close UNICO ;
====

Ciao,
Maxx



Reply to: