PDA

Visualizza la versione completa : split di un file in + file


nik600
12-08-2005, 10:12
ciao a tutti

ho un file che contiene 200 email(spam) in formato testuale separate ognuna da un carattere

^L

c' un programmino che fa lo split del file per ogni ^L e mi crea 200 file differenti?

chiedo la luna?

oppure potrei fare uno script - shell al volo per ho bisogno del vostro aiuto...

non so

splitta tutti i blocchi di testo separati da ^L in un array
redirigi il contenuto dell'elemento iesimo nel file iesimo

possibile?

nik600
12-08-2005, 10:51
ho risolto con un piccolo script in php



<?

$email=file("spam");

$tutto_file="";
for($i=0;$i<sizeof($email);$i++){
$tutto_file.=$email[$i];
}

//echo $tutto_file;

$emails=explode("\fine",$tutto_file);

for($i=0;$i<sizeof($emails);$i++){

$filename = "spam_dir/spam_".$i;
if (!$handle = fopen($filename, 'w')) {
echo "Cannot open file ($filename)";
exit;
}

fwrite($handle,$emails[$i]);
fclose($handle);
}

echo $i;
?>


il problema che cosi mi mette ogni email in un unica stringa e il client di posta poi mi interpreta la mail mettendo tutto headers e body nel testo...
:master:

cacao74
12-08-2005, 16:49
Ho fatto due piccoli esempi da riga di comando con awk.

Prendo in considerazione le email conservate da Thunderbird; le email sono le notifiche del forum, tanto per essere chiari.
Ogni email inizia in questo modo:

From - Tue Aug 9 15:53:31 2005

ovvero una stringa From seguita da una data in formato esteso.
Questo per differenziarla dal campo From: dell'header dell'email stessa

Con AWK, salvo ciascuna mail contenuta nel file 'Inbox', su un file diverso, cosi':


cacao74@winnie:~/tmp/mail$ awk ' \
BEGIN { counter = 0 } \
{ if ( $0 ~ /^From -/ ) ++counter; print $0 >> "spam-" counter ".eml" } ' Inbox


Dovendo trattare il tuo file che ha un separatore di record meglio definito rispetto all'esempio precedente, la soluzione dovrebbe essere ancora pi semplice.

Per simulare il tuo file ho concatenato ciascuna file di mail ottenuto dalla riga di comando precedente, seguita dal carattere '^L', in un nuovo file chiamato Mail.


cacao74@winnie:~/tmp/mail$ for file in *.eml; do cat $file >> Mail; echo '^L' >> Mail; done

Ipotizzando che ogni volta che viene aggiunta un email in questo file, essa viene precedura dal separatore '^L', occorre editare il file appena creato ed eliminare l'ultima riga contenente '^L'. Giusto per essere precisini. :)

Ora, per estrarre ciascuna mail, la nuova riga di comando la seguente:


cacao74@winnie:~/tmp/mail$ awk -v RS="\^L" ' \
BEGIN { counter = 0 } \
{ print $0 > "spam-" ++counter ".eml" } ' Mail


Vedi se la cosa ti piace. :madai!?:

ciao

Loading