|
furiaceca
Messaggi inviati:5
Registrato: lug, 2010
|
|
|
leggere txt - esaminarlo - stampare txt nuovo
|
Inviato:21-lug-2010 19.46
|
|
|
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
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 22-lug-2010 19.37
|
|
|
|
Inserito da:
yosemite
Messaggi inviati: 75\
Registrato: lug, 2007
|
Io se ho capito bene il tuo problema, ovvero eliminare tutti gli elementi duplicati, userei una hashmap e farei così:
import java.io.*; import java.util.*;
public class Main {
public static void main(String[] args) throws Exception{ HashMap hm = new HashMap(); FileReader fr = new FileReader("NomeFile.txt"); BufferedReader br = new BufferedReader(fr); String s; while((s = br.readLine()) != null) { if (!hm.containsKey(s)) hm.put(s,s); } fr.close();
Set set = hm.entrySet(); Iterator i = set.iterator(); FileWriter fw = new FileWriter(new File("output.txt")); BufferedWriter bw = new BufferedWriter(fw);
while(i.hasNext()){ Map.Entry me = (Map.Entry)i.next(); bw.write((String)me.getValue()); bw.newLine(); } fw.close(); } }
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 2.51
|
|
|
|
Inserito da:
furiaceca
Messaggi inviati: 5\
Registrato: lug, 2010
|
ok grazie tante la tua risp mi sarà molto di aiuto!!! Praticamente io dovrei fare la seguente: questo è un parte del txt, la struttura del resto del file è uguale, cioè sono tantissimi blocchi da 8 righe:
<< Legenda: Hairpin ed Energia (1° Rigo) Sequenza (2°Rigo) Posizione dell'hairpin in HPV(3° Rigo) Nome del Gene (4° Rigo) Seed (5° Rigo) Posizione del Seed in HPV (6° Rigo) Posizione del complementare del seed nell'UTR (7° Rigo) Braccio dell'Hairpin in cui si trova il seed(8° Rigo)
.(((......(((.(((((((.((((....(((((...(((((((..(-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 (SPRK) TGTGACTC 742 42 3p
.(((((..((((((((((((..........((..(((((((.(.((... (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGGGCCT 5884 (SPRK) TTCCTGAC 5890 126 5p
.(((......(((.(((((((.((((....(((((...(((((((.....)(-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTTGCAA 684 (SPRK) TGTGACT 742 43 3p
.(((((..((((((((((((..........((..(((((((.(.((.... (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGGGCC 5884 (SPRK) TTCCTGA 5890 127 5p
.(((((..((((((((((((..........((..(((((((.(.((.. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGGT 5884 SAA2/NM_001127380.1 TTTATAA 5905 870 5p
>>
Considera che io, esclusa la leggenda, devo esaminare il 4° rigo di ogni blocco e SOLO se c'è scritto lo stesso nome devo esaminare il 5°rigo, se quest'ultimo è uguale o compreso allora scarto l'intero blocco dove questo è compreso, altrimenti se sono diversi scriverò nell'output l'intero blocco. Ad esempio:confronto il primo blocco col secondo e noto che il 4° rigo del primo blocco (SPRK) è uguale a quello del secondo blocco, allora esamino il 5° rigo di entrambi e noto che però non sono nè uguali nè compresi l'uno nell'altro (TGTGACTC con TTCCTGAC) per cui entrambi i blocchi restano nel testo e passo a confrontare il primo blocco col terzo blocco. In questo caso il quarto rigo è sempre uguale (SPRK) allora esamino il 5° rigo e vedo che TGTGACT è compreso in TGTGACTC per cui posso scartare l'intero terzo blocco, e così via....nell'ultimo blocco noto invece che addirittura il 4° rigo è diverso e quindi neanche effettuerò un controllo e li lascerò entrambi nel testo...ecc...(perchè i blocchi sono un centinaio).
Ricapitolando di ogni blocco devo esaminare solo riga 4 e in caso la 5, ma poi nell'output.txt dovrò riscrivere (dopo i confronti) l'intero blocco di 8 righe dei "superstiti"
Spero di essermi saputo spiegare
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 14.43
|
|
|
|
Inserito da:
yosemite
Messaggi inviati: 75\
Registrato: lug, 2007
|
Vedendo la struttura del tuo file .txt ho deciso di creare una classe "Gene" che rappresenta i blocchi da otto righe. A questo punto inizio a leggere il file in input saltando le righe della leggenda e riempo una lista di oggetti "Gene". Una volta terminata la lettura del file passo alla fase di controllo degli elementi facendo un ciclo sugli elementi e per ogni elemento richiamo il metodo che passata la collection di geni mi elimina tutti quelli "duplicati". Una volta finito passo alla scrittura del file risultato ciclando sugli elementi rimasti. Per quanto riguarda la struttura del file in input ho sottinteso che non iniziasse con << e non termina con >> inoltre ho anche considerato che tra ogni blocco ci fosse UNA riga vuota Qui di seguito trovi il codice, sicuramente migliorabile, di quello che ho descritto sopra:
import java.io.*; import java.util.*;
public class Main {
private static LinkedList<Gene> readFile() throws Exception{ LinkedList<Gene> clGene = new LinkedList<Gene>(); FileReader fr = new FileReader("NomeFile.txt"); BufferedReader br = new BufferedReader(fr); String s; int numLines = 0; int numLinesBlock = 0; final int endLineLegenda=10; //numero righe legenda Gene obj=null;
while((s = br.readLine()) != null) { numLines++; if (numLines > endLineLegenda) { numLinesBlock++; switch (numLinesBlock){ case 1:{ obj=new Gene(); clGene.add(obj); obj.setHairpin(s); break; } case 2:{ obj.setSequenza(s); break; } case 3:{ obj.setPosizione(s); break; } case 4:{ obj.setNome(s); break; } case 5:{ obj.setSeed(s); break; } case 6:{ obj.setPosizioneHPV(s); break; } case 7:{ obj.setPosizioneUTR(s); break; } case 8:{ obj.setBraccioHairpin(s); break; } case 9:{ numLinesBlock = 0; break; } } } } fr.close();
return clGene; }
private static void compareItems(LinkedList<Gene> clGene){ Gene obj; int i=clGene.size()-1; while (i>=0){ obj=clGene.get(i); obj.removeDuplicatedItems(clGene); i--; } }
private static void writeFile(LinkedList<Gene> clGene) throws Exception{ FileWriter fw = new FileWriter(new File("output.txt")); BufferedWriter bw = new BufferedWriter(fw); Iterator i = clGene.iterator();
bw.write("Legenda:"); bw.newLine(); bw.write("Hairpin ed Energia (1° Rigo)"); bw.newLine(); bw.write("Sequenza (2°Rigo)"); bw.newLine(); bw.write("Posizione dell''hairpin in HPV (3° Rigo)"); bw.newLine(); bw.write("Nome del Gene (4° Rigo)"); bw.newLine(); bw.write("Seed (5° Rigo)"); bw.newLine(); bw.write("Posizione del Seed in HPV (6° Rigo)"); bw.newLine(); bw.write("Posizione del complementare del seed nell''UTR (7° Rigo)"); bw.newLine(); bw.write("Braccio dell''Hairpin in cui si trova il seed (8° Rigo)"); bw.newLine(); bw.newLine();
while(i.hasNext()){ Gene me = (Gene)i.next(); bw.write(me.getHairpin()); bw.newLine(); bw.write(me.getSequenza()); bw.newLine(); bw.write(me.getPosizione()); bw.newLine(); bw.write(me.getNome()); bw.newLine(); bw.write(me.getSeed()); bw.newLine(); bw.write(me.getPosizioneHPV()); bw.newLine(); bw.write(me.getPosizioneUTR()); bw.newLine(); bw.write(me.getBraccioHairpin()); bw.newLine(); bw.newLine(); } bw.flush(); fw.close(); }
public static void main(String[] args) throws Exception { LinkedList<Gene> clGene=readFile(); compareItems(clGene); writeFile(clGene); }
}
class Gene{ String _Hairpin; String _Sequenza; String _Posizione; String _Nome; String _Seed; String _PosizioneHPV; String _PosizioneUTR; String _BraccioHairpin;
public String getBraccioHairpin() { return _BraccioHairpin; }
public void setBraccioHairpin(String _BraccioHairpin) { this._BraccioHairpin = _BraccioHairpin; }
public String getHairpin() { return _Hairpin; }
public void setHairpin(String _Hairpin) { this._Hairpin = _Hairpin; }
public String getNome() { return _Nome; }
public void setNome(String _Nome) { this._Nome = _Nome; }
public String getPosizione() { return _Posizione; }
public void setPosizione(String _Posizione) { this._Posizione = _Posizione; }
public String getPosizioneHPV() { return _PosizioneHPV; }
public void setPosizioneHPV(String _PosizioneHPV) { this._PosizioneHPV = _PosizioneHPV; }
public String getPosizioneUTR() { return _PosizioneUTR; }
public void setPosizioneUTR(String _PosizioneUTR) { this._PosizioneUTR = _PosizioneUTR; }
public String getSeed() { return _Seed; }
public void setSeed(String _Seed) { this._Seed = _Seed; }
public String getSequenza() { return _Sequenza; }
public void setSequenza(String _Sequenza) { this._Sequenza = _Sequenza; }
public void removeDuplicatedItems(LinkedList<Gene> clGene){ int j=clGene.size()-1; while (j>=0){ if (!clGene.get(j).equals(this)) if (this.getNome().compareToIgnoreCase(clGene.get(j).getNome())== 0) if (this.getSeed().startsWith(clGene.get(j).getSeed())) clGene.remove(j); j--; } } }
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 16.23
|
|
|
|
Inserito da:
furiaceca
Messaggi inviati: 5\
Registrato: lug, 2010
|
perfetto!!!! grazie davvero mille...mi hai dato una grossissima mano, non so quanto ringraziarti. Ora devo così solo incrementare il tuo codice per eliminare pure quelli che non iniziano con la stessa lettera ma sono pur sempre compresi (per intenderci ad esempio se nella 5° riga di un blocco ho ATTGGTGG devo poter eliminare pure il blocco che alla 5° riga ha TGGTG )... grazie ancora!!!!!!!!!! mi rimetto a lavoro!!
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 17.08
|
|
|
|
Inserito da:
yosemite
Messaggi inviati: 75\
Registrato: lug, 2007
|
beh a sto punto dovrebbe bastare sostituire nella funzione removeDuplicatedItems della classe Gene al posto di startsWith usare la funzione contains.
Facendo delle prove ho avuto dei problemi di indice tutto perchè variava il numero di elementi sul quale facevo il ciclo allora ho cambiato il codice così private static void compareItems(LinkedList<Gene> clGene){ LinkedList<Gene> toRemove=new LinkedList<Gene>();
int i=clGene.size()-1; while (i>=0){ toRemove.addAll(clGene.get(i).DuplicatedItems(clGene)); i--; }
i=toRemove.size()-1; while (i>=0){ clGene.remove(toRemove.get(i)); i--; } } e la funzione removeDuplicatedItems l'ho cambiata così cambiando il nome e ho già aggiunto la clausola contains al posto di startWithpublic LinkedList<Gene> DuplicatedItems(LinkedList<Gene> clGene){ LinkedList<Gene> toRemove=new LinkedList<Gene>(); int j=clGene.size()-1; while (j>=0){ if (!clGene.get(j).equals(this)) if (this.getNome().compareToIgnoreCase(clGene.get(j).getNome())== 0) if (this.getSeed().contains(clGene.get(j).getSeed())) toRemove.add(clGene.get(j)); j--; } return toRemove; }
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 18.46
|
|
|
|
Inserito da:
furiaceca
Messaggi inviati: 5\
Registrato: lug, 2010
|
ok grazie ancora davvero!! solo un'ultima cosa vorrei chiederti, ho notato che se due sequenze sono uguali, ma non comprese in nessun'altra ne dovrebbe stampare solo un blocco delle due, invece me li elimina entrambe, mi sai spiegare il perchè? ti allego un pezzo di txt dove questo si può verificare così se puoi ed hai tempo lo provi pure tu e mi dici se fa lo stesso problema pure a te:
Legenda: Hairpin ed Energia (1° Rigo) Sequenza (2°Rigo) Posizione dell'hairpin in HPV(3° Rigo) Nome del Gene (4° Rigo) Seed (5° Rigo) Posizione del Seed in HPV (6° Rigo) Posizione del complementare del seed nell'UTR (7° Rigo) Braccio dell'Hairpin in cui si trova il seed(8° Rigo)
.(((......(((.(((((((.((((....(((((...(((((((... (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 AAGTGTGA 739 300 3p
.(((......(((.(((((((.((((....(((((...(((((((... (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 AAGCAGAA 692 2549 5p
.(((......(((.(((((((.((((....(((((...(((((((... (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGT 684 ABCA1 TGTGACTC 742 3270 3p
.(((......(((.(((((((.((((....(((((...(((((((... (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 AGTGTGA 740 2681 3p
.(((......(((.(((((((.((((....(((((...(((((((.. (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 AAGTGTG 739 301 3p
.(((......(((.(((((((.((((....(((((...(((((((...(-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 GTTGCAA 734 345 3p
.(((......(((.(((((((.((((....(((((...(((((((.. (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 GTTGCAA 734 1469 3p
.(((((..((((((((((((..........((..(((((((.(.((. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGG 5884 ABCA1 TCATTTT 5901 993 5p
.(((((..((((((((((((..........((..(((((((.(.((. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTG 5884 ABCA1 TCATTTT 5901 2002 5p
.(((((..((((((((((((..........((..(((((((.(.((.. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGG 5884 ABCA1 TCCTGAC 5891 1207 5p
.(((((..((((((((((((..........((..(((((((.(.((. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGGG 5884 ABCA1 GTTTTCC 5887 1534 5p
.(((((..((((((((((((..........((..(((((((.(.((. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTG 5884 ABCA1 TTTTATA 5904 1685 5p
.(((......(((.(((((((.((((....(((((...(((((((.. (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTTG 684 ABCA1 AAGCAGA 692 2550 5p
.(((((..((((((((((((..........((..(((((((.(.((.. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTGG 5884 ABCA1 TTTTCCT 5888 3190 5p
.(((((..((((((((((((..........((..(((((((.(.((.. (-30.60) TTGGTTTTCCTGACACCTCATTTTATAATCCAGATACACAGCGGCTGGTTTG 5884 ABCA1 CATTTTA 5902 3239 5p
.(((......(((.(((((((.((((....(((((...(((((((... (-31.00) AGCTGGACAAGCAGAACCGGACAGAGCCCATTACAATATTGTAACCTTTTGTT 684 ABCA1 TGTGACT 742 3271 3p
Il programma infatti fa tutto quello che deve fare (grazie al tuo codice) e cioè elimina i duplicati e quelli contenuti, però se noti ad esempio il blocco 6 e 7 al 5° rigo hanno la stessa sequenza GTTGCAA (che non è compresa in altri) e li elimina entrambi, stessa cosa la blocco 8 e 9 con la sequenza TCATTTT. Scusa il disturbo...
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 19.04
|
|
|
|
Inserito da:
yosemite
Messaggi inviati: 75\
Registrato: lug, 2007
|
Errore mio devo richiamare DuplicatedItems solo se l'elemento non è già contenuto nella collection degli elementi da rimuovere. Prova a vedere se così funziona che non l'ho testato:
private static void compareItems(LinkedList<Gene> clGene){ LinkedList<Gene> toRemove=new LinkedList<Gene>();
int i=clGene.size()-1; while (i>=0){ if (!toRemove.contains(clGene.get(i))) toRemove.addAll(clGene.get(i).DuplicatedItems(clGene)); i--; }
i=toRemove.size()-1; while (i>=0){ clGene.remove(toRemove.get(i)); i--; } }
|
|
 |
|
Re: leggere txt - esaminarlo - stampare txt nuovo
|
Inviato: 23-lug-2010 19.27
|
|
|
|
Inserito da:
furiaceca
Messaggi inviati: 5\
Registrato: lug, 2010
|
si, perfetto!!! funziona tutto al 100% ti ringrazio davvero tantissimo per l'aiuto!!! Buon pomeriggio!!! ;)
|
|
|