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

> Torakiki 

 prima riga che contenga del testo?
a occhio e croce... (non garantisco che sia il sistema migliore)
apro file originario
creo un file temporaneo
fino alla fine del file
        leggo una riga
        se la riga e' vuota (o contiene quello che vuoi eliminare dal fondo) la memorizzo
        altrimenti
                scrivo le righe memorizzate
                scrivo la riga corrente
                cancello la memoria delle righe
chiudo il file originale
chiudo il file temporaneo
sovrascrivo il file originale con il file temporaneo

 a occhio e croce... (non garantisco che sia il sistema migliore)
dipende chiaramente dalle dimensioni dei file ... se fossi sicuro che sono file piccoli
userei file()
...

> Torakiki

 rivolgermi al C :-(
Allora puoi aprirlo con fopen, fare un fseek alla fine del file, e
risalire con fseek negativo finche` non trovi un carattere diverso da \n
A quel punto sai in che posizione del file ti trovi, e con ftruncate lo
tronchi a quella posizione+2 (il carattere che hai appena letto e un
singolo \n).
Se le righe vuote sono una decina significa che leggi una dozzina di
caratteri dal file (col caching, probabilmente 4 o 8 Kb), invece di
memorizzarlo tutto in RAM (sempre che il S.O. sotto sia abbastanza
intelligente da cachare solo quello che stai leggendo e non tutto... :)
Bye.
-- 
Alessandro Pellizzari

> Torakiki

> Torakiki

 :-)
non ha senso farlo.
leggilo riga per riga...
si dovrebbe leggere il file a ritroso...
 

 singolo \n).
esatto e' un pochino piu' difficile da scrivere rispetto a leggersi tutto il file riga per riga...
ma se sono file da 40MB e deve fare quest'operazione periodicamente
e' assolutamente l'unica soluzione.

> Torakiki

 fclose($fp);
Cosi` non combini niente.
Dovresti usare
$newStr = trim(fread($fp, filesize("file.txt"));
ma la prima limitazione che mi viene in mente e` sull'occupazione di
memoria degli script, solitamente limitata a 2 o 8 Mb, e la sfori.
Poi ci sono i 30 secondi di esecuzione, e se non li sfori, ti ci
avvicini pericolosamente, e non te ne rimangono per fare la write in
seguito.
A parte questo, e` un vero spreco di risorse, quella che io chiamo
(scherzosamente ma non troppo) la "MS-way". :)
Inoltre, a me file() ha dato parecchi problemi di prestazioni su file
gia` di 2 Mb, con limite di memoria impostato a 32Mb e limite di tempo a
2 minuti. Solo che li` dovevo per forza esaminare diverse righe del file
sparse in giro. Mi sto attrezzando per convertirlo con fread(), ma anche
cosi` le prestazioni sono abbastanza basse (anche se riesce a esaminare
una parte molto maggiore del file).
Bye.
-- 
Alessandro Pellizzari

 
ma vi rendete conto dello spreco di risorse?
quella riga di codice fara' la differenza tra portare a termine o non
portare a termine l'operazione..
se non sbaglio bisogna eliminare le righe vuote dalla fine del file..
ci si posiziona alla fine del file e si inizia a leggere a ritroso finche'
incontriamo caratteri 'bianchi' (ie. LF CR TAB SPACE etc..)
quando non si trovano piu' caratteri del genere si tronca il file alla
lunghezza dovuta con ftruncate..
$newStr = trim(fread($fp, filesize("file.txt"));
esegue un trim sull'intero file letto in una stringa..
se un file e' di 30MB.. o l'operazione risulterebbe estremamente lunga o la
fine dello script non sarebbe raggiunta..
-- 
www.iuz-lab.info

 portare a termine l'operazione..
Se leggi il resto del messaggio che quoti e il mio intervento precedente
nello stesso thread, dicevo la stessa cosa, ma volevo solo portare una
correzione che potrebbe essere utile in altri casi, come la lettura di
file di 3-4 Kb, che si effettua tranquillamente.
Bye.
-- 
Alessandro Pellizzari

Alessandro Pellizzari wrote:

ma infatti e' giusto procedere con fread visto che parliamo di file di
dimensioni abbastanza notevoli..
ti basta un..
if (fseek($fp, -1, SEEK_END) == 0) {
 while (($c = fread($fp, 1)) !== FALSE AND $c = ord($c)) {
  if ($c > 32 AND $c < 255) break;
  fseek($fp, -2, SEEK_CUR);
 }
 ftruncate($fp, ftell($fp));
}
e sei a posto senza sprecare troppe risorse..
-- 
www.iuz-lab.info


:Provate a guardare gli ingredienti del famoso Labello che si usa per
:le labbra screpolate: Butirrospermum Parkii (sperma di maiale).

puoi impostare $good a (end_of_file - N kilobytes).
...cosi' com'e' mi pare la soluzione di Alessandro Pellizzari, mentre se
il numero di righe da tranciare e' basso, diventa piu' efficiente quella
proposta da iuz.
E mi sono sbagliato a scrivere il secondo "fseek", e' un "ftruncate" :-)
Leonardo in ritardo con la lettura dei post
