Newsgroup: it.comp.www.php
Titolo: parsing "pesante" di un file

salve,
devo realizzare un parasing di un file piuttosto grosso circa da 10 a 500mb
mi chiedevo se potevate darmi qualche consiglio .
La struttura č abbastanza lineare ogni linea ha degli attributi (piů 
attributi) che vengono indentifcati dal numero di caratteri.
es:
nome = 10 carattteri
cognome = 20 caratteri
etc.
mi chiedevo quale poteva essere la soluzione migliorare da utilizzare in 
questi casi io pensavo a fgetc (leggere carattere per volta)
ma non so quanto sia "bella" ho escluso per regexp per via della dimensione
voi che dite  ?

 etc.
Se le righe hanno tutte la stessa lunghezza e' sufficiente fread, poi
dipende da cosa devi farci con i dati che hai letto.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

ciao, questo è un file che a me è servito su un file di testo da 400 mega
devi però aumentare a dismisura le capacità del php come ram e tempo di
esecuzione:
$db = file("./pedaggi.seq");
/*                          ^decimale^
01 443 420 99 141 4 0090000 0037000 000660 000670 000820 001300 001560
2  3   3   2  3   1 7       7       6      6      6      6      6
*/
//$db = explode("\n",$db);
$estrazione = array();
$serial = array();
$conta = count($db);
print("<pre>");
foreach($db as $val){
if(substr($val,8,2) == "99" ){
$riga = array();
        $inizio         = 0;
        $plus           = 2;
        $rete           = substr($val,$inizio,$plus);
//rete
        $inizio         = $plus + $inizio;
        $plus           = 3;
        $uscita         = substr($val,$inizio,$plus);
//uscita
        $inizio         = $plus + $inizio;
        $plus           = 3;
        $entrata        = substr($val,$inizio,$plus);
//entrata
        $inizio         = $plus + $inizio;
        $plus           = 2;
        $filler_0       = substr($val,$inizio,$plus);
//filler_0
        $plus           = 6;
//soc_uscita
        $inizio         = $plus + $inizio;
        $plus           = 7;
        $mt_pia = substr($val,$inizio,$plus);
//$mt_pia
        $inizio         = $plus + $inizio;
        $plus           = 7;
        $mt_mon = substr($val,$inizio,$plus);
//$mt_mon
        $inizio         = $plus + $inizio;
        $plus           = 6;
        $ped_arr_a      = substr($val,$inizio,$plus);
//$ped_arr_a
        $inizio         = $plus + $inizio;
        $plus           = 6;
        $ped_arr_b      = substr($val,$inizio,$plus);
//$ped_arr_b
        $inizio         = $plus + $inizio;
        $plus           = 6;
        $ped_arr_3      = substr($val,$inizio,$plus);
//$ped_arr_3
        $inizio         = $plus + $inizio;
        $plus           = 6;
        $ped_arr_4      = substr($val,$inizio,$plus);
//ped_arr_4
        $inizio         = $plus + $inizio;
        $plus           = 6;
        $ped_arr_5      = substr($val,$inizio,$plus);
//$ped_arr_5
$SQL = "INSERT INTO valori VALUES
(
$rete,
$uscita,
$entrata,
$mt_pia,
$mt_mon,
$ped_arr_a,
$ped_arr_b,
$ped_arr_3,
$ped_arr_4,
$ped_arr_5 ) ";
$query = mysql_query($SQL)or die($SQL.mysql_error());
//print($i++."\n");
//print("<pre>");
}
}
echo("\nFinito");
print("</PRE>");
-- 
chmod a-rw The\ Untouchables.avi

 $db = file("./pedaggi.seq");
Pessimo consiglio, un codice del genere farebbe "sedere" qualsiasi
server, oltre ad essere molto inefficiente.
-- 
I am what I am, I do what I can
