PDA

Visualizza la versione completa : [perl] Consigli


push_87
04-04-2011, 09:54
Ciao a tutti, sono nuovo del forum. Dovrei realizzare un'applicativo con Perl (premetto che non l'ho mai usato, conosco bene C++, Mysql e ho qualche conoscenza di Java) e vorrei qualche consiglio....

Vi spiego in poche parole cosa dovrei fare:

Di base ho, ad esempio, 300 file .txt contenenti dei traceroute

Ogni file contiene quindi gli indirizzi IP dei nodi fino ad arrivare al nodo padre + informazioni che a me non servono (tempi in ms per raggiungere i vari nodi, etc)

Dovrei:

- Estrarre da ogni file i soli indirizzi IP nell'ordine in cui sono inseriti

- Creare un file .csv (o xls) in cui ho 300 righe ed ogni riga contiene gli indirizzi IP che vanno dal nodo figlio al nodo padre!

Spero di essere stato chiaro, casomai se serve posso allegare un file di esempio...

Avete qualche consiglio? Qualcuno pensa che si potrebbe fare con qualche altro linguaggio di programmazione?

Grazie a tutti

shishii
04-04-2011, 16:48
incolla 2, 3 righe di esempio.

Ritengo che si possa fare in qualunque linguaggio di programmazione, ma in Perl credo sia più semplice.

push_87
04-04-2011, 17:21
Allora, fai finta che ho questi 2 file (in realtà dovrebbero essere più di 300):

1) 001.txt

Rilevazione instradamento verso 100.130.10.76 su un massimo di 30 punti di passaggio

1 <1 ms <1 ms <1 ms 100.76.220.2

2 <1 ms <1 ms <1 ms 100.81.70.101

3 1 ms 1 ms 1 ms 100.130.10.76

Rilevazione completata.

2) 002.txt

Rilevazione instradamento verso 100.130.10.76 su un massimo di 30 punti di passaggio

1 <1 ms <1 ms <1 ms 100.81.170.2

2 <1 ms <1 ms <1 ms 100.79.73.106

3 1 ms 1 ms 1 ms 100.130.10.76

Rilevazione completata.

Dovrei ottenere un file excel di 2 righe così costituito:

001 - 100.76.220.2 - 100.81.70.101 - 100.130.10.76
002 - 100.81.170.2 - 100.79.73.106 - 100.130.10.76

001 e 002 sono i nomi dei file txt (l'IP della sorgente nel traceroute non c'è, quindi come riferimento del punto di partenza ho solo il nome del file!), ogni colonna successiva del file risultante contiene gli indirizzi IP per arrivare a destinazione!

Spero di essere stato chiaro...

Grazie e ciao ciao

shishii
07-04-2011, 21:48
supponendo che i files siano in una specifica directory esclusiva:

opendir (DIR, "/path/nome_directory") or die "Non posso aprire la directory. Errore: $!\n";
@files = grep { /^\./ && -f "/path/nome_directory/$_" } readdir(DIR);
closedir DIR;

open (DATA, ">/path/nome_file_dati") or die "Non posso scrivere su /path/nome_file_dati. Errore: $!\n";
foreach $file (sort @files) {
$file =~ /(\d+)\.txt/;
$record = "";
$record = $1;
open (FILE, "/path/$file") r die "Non posso leggere /path/$file. Errore: $!\n";
while (FILE) {
$_ =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/;
$record .= " - $&";
}
close FILE;
print DATA "$record\n";
}
close DATA;

Salvo errori ed omissioni

push_87
09-04-2011, 08:06
Grazie per la risposta!

Ho il problema che non mi funziona e non capisco perchè... Lo faccio partire, compare la schermata di esecuzione, in meno di un secondo scompare e non succede niente...

Io ho installato ActivePerl 5.10; di funzionare funziona perchè ho creato un tool per calcolare l'area di un rettangolo (così inizio a prendere confidenza...).

Se ti può essere di aiuto, nei comandi che mi hai scritto tu ho inserito due righe iniziali per inserire un numero ma il tutto non funziona comunque...

Ciao ciao

shishii
09-04-2011, 20:17
nel codice che ho postato (e che devi comunque controllare) c'è un errore, devi scrivere:

while (<FILE>) {

push_87
11-04-2011, 12:17
Ciao, ho ricontrollato il codice, lo esegue ma mi genera un file vuoto. Ti commento il codice per vedere se sbaglio qualcosa:

opendir (DIR, "D:/traceroute") or die "Non posso aprire la directory. Errore: $!\n";
@files = grep { /^\./ && -f "D:/traceroute/$_" } readdir(DIR);
closedir DIR;
# la directory la apre, la sintessa del grep è corretta
open (DATA, ">D:/traceroute/Ciao.txt") or die "Non posso scrivere su D:/traceroute/Ciao.txt. Errore: $!\n";
# Il file Ciao.txt me lo crea
foreach $file (sort @files)
{
$file =/Prova.txt/;
#visto che non mi scriveva niente su Ciao.txt, come file gli ho dato un singolo file dal nome Prova.txt
$record = "";
$record = $1;
open (FILE, "D:/traceroute/$file") or die "Non posso leggere D:/traceroute/$file. Errore: $!\n";
while (<FILE>) {
$_ =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/;
# la sintassi per trovare l'IP è corretta, se faccio una prova in cui voglio trovare un IP da stringa funziona, nel mio caso invece su Ciao.txt non scrive nulla
$record .= " - $&";
#ho provato a togliere il punto davanti all'uguale ma niente; poi una domanda: cosa vuol dire quello dopo l'uguale?
}
close FILE;
print DATA "$record\n";
}
close DATA;

Grazie e ciao ciao

shishii
11-04-2011, 19:04
questo
$file =/Prova.txt/;

deve essere scritto così
$file =~ /Prova.txt/;

$record .= " - $&";
#ho provato a togliere il punto davanti all'uguale ma niente; poi una domanda: cosa vuol dire quello dopo l'uguale?

significa aggiungi (.=) alla stringa $record uno spazio poi un trattino poi la stringa matchata prima ovvero l'IP.

Loading