PDA

View Full Version : [JAVA]leggere txt - esaminarlo - stampare txt nuovo


amsr
21-07-2010, 17:37
Salve, come si intuisce dal titolo il programma che dovrei realizzare è il seguente:
Devo leggere un file (.txt) che ho (molto grande 10MB), all'interno del quale ci sono scritti dei dati che devo esaminare per poi restituire il risultato in un nuovo txt.
Per leggere il txt penso di utilizzare il BufferedReader e per restituire l'output il PrintWriter (corregetemi se sbaglio).
Il problema principale è esaminare il tutto all'interno del file? Come fare?
In questo file ci sono moltissimi dati (un dato per ogni riga) e devo confrontare solo alcune righe di questo file tra loro, per eliminare quelle che si ripetono.
Mi potete aiutare?
Grazie mille

PGI-Bis
21-07-2010, 21:47
Se devi rimuovere i duplicati, puoi dire:

Set<String> stringhe = new TreeSet<String>();
Scanner in = new Scanner(fileIn);
while(in.hasNext()) stringhe.add(in.next());
PrintStream out = new PrintStream(fileOut);
for(String s : stringhe) out.println(s);

e questo, a spanne, direi fino a un gigabyte di dati circa (dipende in verità da quanta memoria accettabilmente rapida hai a disposizione).

Ponendo il caso di una quantità di dati illimitata, la soluzione potrebbe essere uguale, salvo l'uso di un albero "mappato" su disco anzichè in memoria. Qui abbondano le soluzioni precotte. Ad esempio berkeley db è in pratica un albero B su disco, potresti usare quello: carichi una linea per volta, travasi sul database, quando hai finito di leggere il file di origine prendi i dati dal database in ordine. Anche qui sono poche righe di codice.

amsr
22-07-2010, 16:11
Questo è un parte del txt

PGI-Bis
22-07-2010, 16:37
La situazione è la stessa, solo che anzichè leggere, confrontare e scrivere delle stringhe leggi, confronti e scrivi dei blocchi.

Vale a dire, il tuo programma è una cosa di questo tipo:

BlockReader blockReader = new BlockReader(il file di input);
Set<Block> result = new TreeSet<Block>();
while(blockReader.hasNext()) {
result.add(blockReader.next());
}
BlockWriter blockWriter = new BlockWriter(il file di output);
for(Block b : result) {
blockWriter.write(b);
}

Block sarà un tipo di oggetti dotati di un ordine calcolato in base al valore della quarta e quinta riga (che saranno il quarto e il quinto valore di un oggetto block).

amsr
22-07-2010, 17:02
Perfetto..allora lavoro subito su queste istruzioni che mi hai dato!!!
BlockReader e BlockWriter sono comunque delle classi già incluse in java.io ??
Quindi dovrò creare una classe che fa questo confronto di riga 4 e poi 5, definendo il tipo Block, giusto?
Grazie tante!!!

amsr
22-07-2010, 17:03
P.S. scusami per le domande che possono sembrare a volte banali, ma sono un novello di Java, come si poteva capire.
Thanks

PGI-Bis
22-07-2010, 17:19
BlockReader e Writer sono delle classi che creerai tu per rappresentare, insieme a Block, la struttura del file e la capacità di leggere e scrivere file aventi quella struttura.

amsr
22-07-2010, 18:04
ok grazie ancora

amsr
23-07-2010, 16:51
ok tutto fatto, grazie lo stesso, bye