|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
|
[C++/Perl] c'e' un modo per fare pattern matching su file?
Ciao a tutti!
vorrei simulare in C++ il comportamento di Perl, il quale permette di riconoscere all'interno di un file dei pattern di stringhe e quindi salvare i valori che seguono il pattern interessato. Ad es se il fiel contiene la dicitura: ... altro ... PEPMASS=56.565565565 ... altro ... vorrei poter estrarre il valore numerico che segue PEPMASS= Ed inoltre, se il file contiene un elenco (di cui non conosco a priori la lunghezza), di coppie di valori del tipo 32.56565 5 vorrei poter salvare ciascun double in un'array e ciascun int nell'altro, senza problemi di allocazione di memoria. [in quanto c++ richiede di definire a priori la quantita' oppure di allocare in heap in modo dinamico] Esempio codcie Perl #!usr/bin/local/perl use strict; use warnings; ########################################## our @mass_list; our @intensity; our $precursor; our $ret_time; our $tic; our $charge; ######################################### my $file_name = shift @ARGV; $_ = $file_name; m/(-\S+)\./; my $out_file = $1; open (FH,"$file_name"); open (WH,">peak_list".$out_file.".csv"); while (<FH>) { if (m/^\d/) { my @temp = split/,/; if ($temp[0]-$precursor >10 || $temp[0]-$precursor < -10 ) { push @mass_list, $temp[0]; push @intensity, $temp[1]; } } elsif(m/PRE/) { my @temp = split/=/; chomp(@temp); $precursor = $temp[1]; } elsif(m/SCAN/) { if($precursor>0) { &peaks; } splice @mass_list; splice @intensity; $precursor = 0; } elsif(m/RET/) { my @temp = split/=/; chomp(@temp); $ret_time = $temp[1]; } elsif(m/TIC/) { my @temp = split/=/; chomp(@temp); $tic = $temp[1]; } elsif(m/Cha/) { my @temp = split/=/; chomp(@temp); $charge = $temp[1]; } } close FH; close WH; ometto la definizione delle subroutine Esempio del file usato SEARCH=MIS REPTYPE=Peptide BEGIN IONS PEPMASS=308.940860567341 CHARGE=1+ TITLE=Elution from: 2.29 to 2.29 period: 0 experiment: 1 cycles: 1 155.978 3.5 179.093 4 183.121 7 197.007 3 235.195 3.5 290.936 3.5 291.266 3 292.929 2 293.214 4 293.254 2 295.224 2.5 308.949 27 309.134 4 309.213 40.5 309.307 2 309.937 6.5 309.953 4 309.974 7 310.187 2 310.209 5 310.232 6 310.26 3 310.328 6 310.362 2 310.905 2 310.922 2.5 310.962 2 310.982 2 311.229 5 311.278 2.5 311.301 3 312.287 3 312.324 2.5 312.357 2 END IONS Valori che voglio estrarre in C++ il valore di PEPMASS, CHARGE e TIME e la lista dei valori che precede la key word END IONS. Soluzione Artigianale che sto elaborando sto cercando di scrivere del codice che sia in grado di ricostruire i valori ricercati, riconoscendo carattere dopo carattere i pattern. Finora sono a buon punto, ma mi sembra abbastanza artificiosa la cosa. Trovo difficolta' nell'allocazione della memoria della lista dei valori dato che non conosco a priori quante line contengono valori del tipo 312.85 5 e quindi non so che dimensionei dare all'array da allocare Pensavo di usare l'fseek per riposizionarmi all'inzio dell'elenco una volta che ho contato il numero delle linee conteneti i valori del tipo 312.52 5 che mi interessano. E quindi allocare l'esatta quantita' di memoria che mi serve. Qualcuno avrebbe una soluzione +intelligente e pratica? Grazie mille!!!! Ultima modifica di shang84 : 22-10-2005 alle 14:48. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:53.



















