MokaForum - Il forum di MokaByte
Login Impostazioni Home Esci
Forums - leggere txt - esaminarlo - stampare txt nuovo
Forum MokaByte



leggere txt - esaminarlo - stampare txt nuovo
Home » Forums » Manuale Pratico di Java

Risposte: 8   Ultima risposta inviata da: furiaceca (23-lug-2010 19.27)

 Rispondi  Crea un nuovo Topic  Cerca
 
  Lista dei Topic
 
furiaceca

Messaggi inviati:5
Registrato: lug, 2010

leggere txt - esaminarlo - stampare txt nuovo Inviato:21-lug-2010 19.46
Rispondi
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
Rispondi
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
Rispondi
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
Rispondi
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
Rispondi
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
Rispondi
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 startWith
public 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
Rispondi
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
Rispondi
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
Rispondi
Inserito da: furiaceca    Messaggi inviati: 5\ Registrato: lug, 2010
si, perfetto!!! funziona tutto al 100%
ti ringrazio davvero tantissimo per l'aiuto!!!
Buon pomeriggio!!! ;)


 
  Lista dei Topic      Inizio pagina
 





Forum Home | Login | Cerca

[ MokaForum è basato su Jive Forums ]
MokaByte® è un marchio registrato da MokaByte s.r.l.
Java® Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti sono riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it