Leggere txt - esaminarlo - stampare txt nuovo

di il
3 risposte

Leggere txt - esaminarlo - stampare txt nuovo

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

3 Risposte

  • Re: Leggere txt - esaminarlo - stampare txt nuovo

    Leggi una riga alla volta e se è un dato che ti serve lo usi, sennò continui con la lettura.

    qualcosa come :
    
    while(reader.readLine() != null) /* legge tutte le righe */
    {
    /* qui metti un controllo per verificare se la riga ti serve 
     * se ti serve ci fai quello che ci devi fare 
     * altrimenti prosegui con il ciclo 
     */
    }
    se poi il tuo scopo è eliminare le ripetizioni..mmm.. ti fai una lista ordinata, per ogni riga controlli se è già presente nella lista, e se non è presente la aggiunti.. una sorta di struttura dai Insieme
  • Re: Leggere txt - esaminarlo - stampare txt nuovo

    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

    Ti consiglio di fare una lista di vettori, del tipo :

    ArrayList<String[]> lst;

    dove ogni elemento, quindi ogni vettore di stringhe, rappresenta un blocco, quindi leggi il file facendo tipo :
    lst.add(new String[8]);
    for(int i = 0; i < 8; i++){
        lst.get(lst.size() - 1)[i] = reader.ReadLine();
    }
    lo fai finché non finisci il file.

    Poi passi ad una seconda fase di analisi del tipo :
    boolean ok = false;
    for(int i = 0; i < lst.size(); i++){
        int j = 0;
        while (j < lst.size() && !ok){
            if (i != j)
                if (!(ok = controllo(lst.get(i), lst.get(j)))
                    j++
        }
        if (ok)
            scrivi_blocco_su_file(lst.get(i));
    }
    il codice controlla un blocco con ogni blocco diverso da se stesso, e se ne trova almeno uno con le caratteristiche che vanno bene, si ferma nei controlli, scrive il blocco nel file e passa al successivo, ad esempio :

    Blocchi

    A1
    B1
    C1
    A2
    D1

    confronto (solo sulla lettere):

    A1 con B1, diversi
    A1 con C1, diversi
    A1 con A2, uguali, scrivo A1, termino
    B1 con A1, diversi
    B1 con C1, diversi
    B1 con A2, diversi
    B1 con D1, diversi, finiti, termino
    C1 con A1, diversi
    ...
    A2 con A1, ugualei, scrivo A2, termino
    ...
    D1 con A2, diversi, finiti, termino
    nessun blocco rimasto, termino

    Output : A1, A2

    spero di aver capito correttamente
Devi accedere o registrarti per scrivere nel forum
3 risposte