Newsgroup: it.comp.lang.delphi
Titolo: Eliminare righe duplicate in un file

Scommetto che avete aperto questo messaggio pensando "tzé, due secondi e gli
rispondo..." ;)
Adesso vi dò la botta: i file di testo possono essere anche di 400-500 mega!
Non c'è problema usando le TStringList?
--
Jax
====
Non è cercando di essere gli altri che si è se stessi.


Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

 (Reset/Rewrite, Read, ReadLn, Write, WriteLn, Flush, Close...).
A questo avevo pensato, ma sinceramente usando questo metodo non so
minimamente come fare per eliminare le righe duplicate... dovrei farmi delle
funzioni di ricerca, e penso proprio che sarebbe più lento di Cané dei tempi
d'oro...
--
Jax
====
E' strano come mai una persona malvagia in vita, da morto, per alcuni,
diventa santo.

Non c'č problema usando le TStringList?
La poperty Capacity della tstringlist ti puo' aiutare restituendoti quante
stringhe e' in grado ancora di allocare la classe.
Pero', mi viene in mente anche un'altra cosa: devi scartare le righe doppie? e
le righe come si presentano? sono di uguale lunghezza oppure sono variabili ?
-- 
Morde. 
(
mo...@despammed.com
)

quanti caratteri x stringa?
Forseciounidea.....
A

 Forseciounidea.....
Uhm, sono variabili, però al 90% sono lunghe 224.
--
Jax
====
Il file-sharing?
"E' grande. E nessuno può farci nulla"
Robbie Williams, musicista

 oppure sono variabili ?
Sono variabili, sempre ovviamente ;)
--
Jax
====
Nel migliore dei casi uno regala quello che gli piacerebbe per sé, ma
di qualità lievemente inferiore. (Adorno)

 Non c'è problema usando le TStringList?
Quello che ti sto per dire non l'ho mai minimamente provato.
Passo 1:
.Usa uno tStringList o se preferisci uno tHashedstringlist con la proprietà
Duplicates attiva (come più preferisci).
.Leggi dal file riga per riga con ReadLN.
.Aggiungi (Add) ogni riga allo tStringList.
.Controlli ad esempio quando arrivi a 100.000 linee e salvi in un file dal
nome progressivo.
.Svuoti lo tStringList e continui ad aggiungere leggendo sempre dal file
sorgente e aggiungendo allo stesso tStringList svuotato.
.Così via fino alla fine del filone.
Avrai N file da 100.000 righe, tranne l'ultimo.
Ogni file non avrà righe duplicate.
Passo 2:
.Crei 2 tStringList o 2 tHashedStringlist.
.Carichi nella prima il primo file. Nella seconda i successivi, uno ad uno,
fino ad arrivare all'ultimo.
.Ad ogni caricamento cerchi ogni riga del primo tStringList nel secondo. Se
la trovi, la elimini. Alla fine di ogni ricerca salvi il secondo
tStringList.
.Quando finisci la sessione della ricerca e eliminazione, Nel primo
tStringList carichi il secondo file e prosegui come descritto qualche punto
sopra.
Esempio:
for a:= 1 to numerofile -1 do
begin
stringlist1.loadfromfile(file[a]);
for b:= a+1 to numero file do
begin
StringList2.Loadfromfile(File[b]);
RicercaRigheDa1Su2ConRimozioneDa2;  // Nome di procedura molto significativa
StringList2.Savetofile(File[b]);
end;
end;
Buona Fortuna! :-)
Giuseppe
PS: Se usi dei tHashedStringList con Sort attivo dovresti andare molto più
veloce.

 d'oro...
Mmmm...la prima bestialità che mi viene in mente:
ordini il file e poi lo leggi riga per riga e la confronti con l'ultima
letta.
Resta il problema di come fare l'ordinamento di un file così grosso. Hai
provato a fare una prova con il sort del dos (magari creando un ramdisk su
una macchina opportunamente carrozzata) e vedere quanto ci mette?
Altrimenti potresti caricare tutto in una tabella temporanea (DB), la ordini
e poi procedi come sopra
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://snurl.com/sito_lis

più non voglio sapere.
Beh... sarebbe interessante capire qualcosa di piu' su questo file da mezzo
giga... ormai hai monopolizzato il ng!
A giudicare dal formato (codici)... potrebbe trattarsi uno stream di frames...
o di un segnale codificato (trattandosi di satellite).
Cmq anche Lis ti ha dato un'idea che volevo proporti ma poi non capendo bene
di cosa si trattasse ho scartato: l'uso di un db engine che scarti per te le
righe doppie.
Caro il nostro Jax... ho l'impressione che il tuo amico dovra' guadagnarselo
questo programmino, visto l'interesse che ha suscitato!
Fuori le infos! Vogliamo sapere tutto!!!
^____^
-- 
Morde. 
(
mo...@despammed.com
)

 Ogni file non avrà righe duplicate.
Questo sembra un *ottimo* metodo, però c'è un però: se disgraziatamente
arrivo alla riga 100.000 e la riga dopo è uguale, non me ne accorgo, giusto?
--
Jax
====
Chi trova un amico trova un tesoro. Chi trova un tesoro se ne fotte
dell'amico. (Ivan Della Mea)

 arrivo alla riga 100.000 e la riga dopo è uguale, non me ne accorgo, giusto?
Quali vincoli/problemi ti ha imposto il tuo amico? Se non ha particolari
problemi di tempo e spazio su disco userei il sort del dos e poi con un
programmino stupidissimo gli risolvi il problema...


 guadagnarselo questo programmino, visto l'interesse che ha suscitato!
Veramente non è proprio un amico. E' un grandissimo rompicoglioni che ha
incontrato quello buono (e se mi dovesse leggere, amen, è la verità, e
probabilmente lo sa anche lui).
--
Jax
====
Il buon senso non avrà dunque mai degli eroi? (Armand Salacrou)

 dos e poi con un programmino stupidissimo gli risolvi il problema...
Sì, direi che è l'idea più percorribile (nonché la più facile per me ;))
Però mi piacerebbe sapere come funziona il sort del dos (oltre a trovarlo,
ma adesso in quattro e quattro google...)
--
Jax
====
L'uomo nasce per soffrire. (Giobbe)

 ma adesso in quattro e quattro google...)
Gulp!!! Trovarlo? Io ho win2000, sono andato in una sessione Dos (cmd.exe),
ho scritto Sort per vedere se c'era ancora e io ce l'ho :-)
Sul come funzioni, non lo so, mi spiace


 Gulp!!! Trovarlo? Io ho win2000, sono andato in una sessione Dos
Azz. Quando pensi di sapere tutto... ^__^;;
--
Jax
====
Un impero fondato sulla guerra deve conservare sé stesso con la guerra.
(Charles de Montesquieu)

 arrivo alla riga 100.000 e la riga dopo è uguale, non me ne accorgo,
giusto?
Giusto, ma non è questo il problema.
Quello di crearsi blocchi di linee ti servirà solo per sveltire il processo
seguente di confronto ed eventuale eliminazione.
Le linee possono essere più o meno ordinate, al fine del eliminazione non
importa. Il risultato finale dei due processi saranno N files,  e nel totale
non ci sarà 1 linea doppia.
Il passo 3, che ho dimenticato, sarà quello di riunire tutti i N files in
uno solo. Ma questo è semplicissimo.
Buon lavoro! Ma per il tipo che hai descritto non ne vale la pena... fatti
pagare.
Ciao!
Giuseppe

 ma adesso in quattro e quattro google...)
Se non ricordo male il SORT lavorava solo con file di testo di massimo 64k.
Ciao
Giuseppe

 Sul come funzioni, non lo so, mi spiace
Google, google, quanto spesso ci dimentichiamo di te. :-)
Vedi se questi possono esserti d'aiuto
http://snurl.com/35ik
http://snurl.com/35in
e un pò di amarcord
http://snurl.com/35ip
Un altro consiglio è quello di cercare i sorgenti di un Sort open source
(
p.es
. quelli di linux) e studiarteli.
ps. ma se è uno spaccaballe non potevi dirgli di no? :-p


 fatti pagare.
Sě, hai ragione, gli dico che non sono capace e che si arrangi.
Buono sě, cog***** no :)
Comunque rileggendo il tuo metodo ho capito... č geniale!
--
Jax
====
Parere non e' essere: ma per essere bisogna anche parere. Nulla
contribuisce tanto a fare il monaco quanto l'abito.

On Wed, 26 Nov 2003 11:12:03 GMT, Jax wrote:
per sapere come funziona il sort apri una shell e scrivi help sort.
usa il 90% della memoria disponibile se in e out sono file altrimenti il 45%
quindi dovrebbe essere abbastanza veloce.
ciao
-- 
Fabrizio Mancini - <f[.]mancini[@]tin[.]it> 26/11/2003 16.02.55


 Non c'è problema usando le TStringList?
Io farei cosi':
1) carichi il file in un DB
2) durante il caricamento isoli la parte di stringa che userai per il
controllo duplicazione in un campo apposito
3) crei un indice in base al valore di quel campo
4) fai la visita dei record dal primo all'ultimo riscrivendo su un file
testo le righe; qualora trovassi due (o piu') volte lo stesso valore del
campo chiave ignori i record successivi al primo
Ciao, Sandro

 Buono sì, cog***** no :)
scusa, ma se tu hai (supponiamo) un amico falegname, gli chiedi di farti
GRATIS le porte di casa? e se hai un amico meccanico, ti fai riparare GRATIS
la macchina? No, immagino, vero? L'amicizia finisce dove comincia il lavoro,
di solito.
Ciao, Sandro

 rispondo..." ;)
Jax, alla fine come hai risolto? Ora siamo curiosi... ;-)


 Jax, alla fine come hai risolto? Ora siamo curiosi... ;-)
Ho risolto che finché non me lo chiederà per piacere non glielo faccio ;)
--
Jax
====
La gravità è qualcosa che mi butta giù!

 Ho risolto che finché non me lo chiederà per piacere
In ginocchio via icq, ovviamente >:)
--
Jax
====
Meglio vivere ricchi, che morire ricchi. (Samuel Johnson)

 Ho risolto che finché non me lo chiederà per piacere non glielo faccio ;)
Uff... :)
se hai a disposizione un file di testo di esempio hai tempo e voglia di fare
una prova con il sort solo per vedere se funziona e in quanto tempo?


 tempo?
Il problema è proprio quello: non ho un file di esempio (non sono un
craccatore io :) ), quindi dovrei sbattermi pure (come se non bastasse) a
creare un file da 500 mega di righe random.
Mentre lo scrivo mi rendo conto che non ci vuole granché, però mi scoccia :)
Quando avrò un attimo di tempo lo farò e vi farò sapere.
--
Jax
====
"Questo cosiddetto 'telefono' ha troppi difetti per poterlo considerare
seriamente come mezzo di comunicazione. Il dispositivo è intrinsecamente
privo di valore, per quel che ci riguarda."
Ignoto, 1876

 Quando avrò un attimo di tempo lo farò e vi farò sapere.
Pensavo che avessi già un file di esempio, altrimenti potevo farlo anche io.
Come non detto allora
