Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Togliere spazi alla fine di un file

38 views
Skip to first unread message

Luk

unread,
Mar 27, 2009, 7:51:30 AM3/27/09
to
ciao a tutti,

premetto che conosco già trim :)

Avrei necessità, dato un file, di eliminare le eventuali righe vuote,
o contenenti spazi bianchi che sono dopo l'ultima riga con qualche
cosa. Esempio:

1: "1234567890"
2: "0987654321"
3: " "
4: \n
5: \t

come posso fare per eliminare le righe n.3, 4 e 5 senza scandire il
file riga per riga (può essere di centinaia di migliaia di righe...)?

grazie mille!

Redwiz

unread,
Mar 27, 2009, 8:50:01 AM3/27/09
to
> 1: "1234567890"
> 2: "0987654321"
> 3: " "
> 4: \n
> 5: \t
>
> come posso fare per eliminare le righe n.3, 4 e 5 senza scandire il
> file riga per riga (puņ essere di centinaia di migliaia di righe...)?

in questa pagina trovi tra gli esempi degli utenti delle implementazioni
di tail tramite fseek:

http://de2.php.net/manual/en/function.fseek.php

potresti fare un tail incrementale finchč non trovi una
riga non vuota.
a quel punto troncare il file a tale riga con ftruncate


Luk

unread,
Mar 27, 2009, 12:50:30 PM3/27/09
to
On 27 Mar, 13:50, Redwiz <red...@inwind.it> wrote:
> > 1: "1234567890"
> > 2: "0987654321"
> > 3: "    "
> > 4: \n
> > 5: \t
>
> > come posso fare per eliminare le righe n.3, 4 e 5 senza scandire il
> > file riga per riga (può essere di centinaia di migliaia di righe...)?

>
> in questa pagina trovi tra gli esempi degli utenti delle implementazioni
> di tail tramite fseek:
>
> http://de2.php.net/manual/en/function.fseek.php
>
> potresti fare un tail incrementale finchè non trovi una

> riga non vuota.
> a quel punto troncare il file a tale riga con ftruncate

Ti ringrazio. Comunque mi sembra un po' farraginosa come strada...
Veramente non c'è una funzione che già implementa il controllo di
linee vuote alla fine di un file? Incredibile..

ciao!
Luk

Andrea D'Amore

unread,
Mar 27, 2009, 1:44:42 PM3/27/09
to
In article
<9bb3c499-5d3f-4d6c...@f19g2000yqh.googlegroups.com>,
Luk <luc...@gmail.com> wrote:

> Veramente non c'è una funzione che già implementa il controllo di
> linee vuote alla fine di un file? Incredibile..

A me sembrerebbe strana una funzione così specifica.

Redwiz

unread,
Mar 27, 2009, 3:01:57 PM3/27/09
to

e una funzione che toglie da un file tutte le filastrocche come la vedi?

:)

MacMax

unread,
Mar 29, 2009, 7:30:37 AM3/29/09
to
Luk <luc...@gmail.com> wrote:

> Ti ringrazio. Comunque mi sembra un po' farraginosa come strada...
> Veramente non c'è una funzione che già implementa il controllo di
> linee vuote alla fine di un file? Incredibile..
>
> ciao!
> Luk

In PHP trovi delle funzioni che ti dicono quando hai raggiunto la fine
della riga e ti mettono il contenuto della riga appena letta in un
array, sta poi a te decidere cosa farne e come verificarle.
Non è sufficiente?

Max
--
http://www.maxori.it
L'Arte è la capacità di fare cose di nessun valore
e di riuscire a venderle
F. Zappa

Luk

unread,
Mar 30, 2009, 9:23:27 AM3/30/09
to
On 29 Mar, 13:30, mac...@nospam.it (MacMax) wrote:
> Luk <luc...@gmail.com> wrote:
> > Ti ringrazio. Comunque mi sembra un po' farraginosa come strada...
> > Veramente non c'è una funzione che già implementa il controllo di
> > linee vuote alla fine di un file? Incredibile..
>
> > ciao!
> > Luk
>
> In PHP trovi delle funzioni che ti dicono quando hai raggiunto la fine
> della riga e ti mettono il contenuto della riga appena letta in un
> array, sta poi a te decidere cosa farne e come verificarle.
> Non è sufficiente?
>
> Max
> --http://www.maxori.it

> L'Arte è la capacità di fare cose di nessun valore
> e di riuscire a venderle
> F. Zappa

Si, ma è che alla fine non riesco a fare quello che voglio. Ad es. il
seguente codice dovrebbe togliere le righe vuote in fondo al file, ma
non lo fa,... perché?

$search = array(" ","\r\n","\r"," \n");
$replace = "";
$userfile = str_replace($search, $replace, $userfile);

grazie

Andrea D'Amore

unread,
Mar 30, 2009, 9:47:40 AM3/30/09
to
In article
<6698997a-eb85-4036...@k2g2000yql.googlegroups.com>,
Luk <luc...@gmail.com> wrote:

> ma non lo fa,... perché?
> $search = array(" ","\r\n","\r"," \n");

Le mie doti di veggente mi suggeriscono che il responsabile è quello
spazio bianco prima del newline.

Chiaramente conoscere il contenuto di $userfile nella prova che dici non
funzionare aiuterebbe.

MacMax

unread,
Mar 30, 2009, 10:53:31 AM3/30/09
to
Luk <luc...@gmail.com> wrote:

> Si, ma è che alla fine non riesco a fare quello che voglio. Ad es. il
> seguente codice dovrebbe togliere le righe vuote in fondo al file, ma
> non lo fa,... perché?
>
> $search = array(" ","\r\n","\r"," \n");
> $replace = "";
> $userfile = str_replace($search, $replace, $userfile);
>
> grazie

Mi ricordo che ho avuto anch'io questo problema e lo avevo aggirato con
questo tipo di codice:

$files = array();
$myFile = fopen($fileName, "r");
$contents = "";
while(feof($myFile)==FALSE) {
array_push($files,fgets($myFile, 1024));
}
fclose($myFile);

A questo punto dentro a $files[] hai tutte le righe del file e le puoi
manipolare come stringhe.
Se ti può essere utile..

Max
--

Alessandro Pellizzari

unread,
Mar 30, 2009, 9:57:26 AM3/30/09
to
Il Fri, 27 Mar 2009 04:51:30 -0700, Luk ha scritto:

> Avrei necessità, dato un file, di eliminare le eventuali righe vuote, o
> contenenti spazi bianchi che sono dopo l'ultima riga con qualche cosa.

Un paio di algoritmi farlocchi:

- leggi tutto il file in una stringa, e poi usi trim()

- apri il file con file(), poi inverti l'array con array_reverse(), quindi
fai un foreach che elimina gli elementi dell'array. Esci dal foreach con
break quando trovi qualcosa di diverso dai blank, quindi ri-array_reverse
() e poi scrivi il file.


Uno un po' piu` furbo: apri il file, usi fseek() per riavvolgerlo di 1 KB,
ti carichi in RAM il pezzo finale, quindi lo analizzi a partire dalla fine
e usando ftruncate() quando non ne trovi piu` lo tronchi direttamente su
disco. Ripetere se non trovi caratteri validi nel KB che hai caricato.
Non ricordo se fseek() e` buffered, nel qual caso puoi usare direttamente
lei e riavvolgere di un carattere alla volta.

Bye.

0 new messages