Input/Output File di testo

di il
4 risposte

Input/Output File di testo

Buongiorno a tutti,

Premessa: vorrei leggere un file di testo (es testo1.txt) contenente una serie di righe e salvare su un altro file (es. testo2.txt) solo alcune righe e alcune colonne del primo file.

file di input: file1.txt è cosi composto:

**************** file elaborato con successo *******************
codice1 q.ta data q.ta2 p.zzo p.zzo2 codice2
0116543 3 01/10/98 - 0 0,00 0,00 901165439
0116528 0 10/12/99 - 0 0,00 0,00 901165288
0983839 0 19/01/04 - 0 5,00 0,00 909838397
0226611 0 07/06/02 - 0 0,00 0,00 902266117
0896087 2 - - 0 5,00 0,00 908960875
4896083 0 29/11/99 - 0 0,00 0,00 808960836
0896053 2 - - 0 5,00 0,00 908960533
0939155 1 27/02/01 - 0 5,00 0,00 909391551
3613833 0 16/01/01 - 0 0,00 0,00 906138336
0930141 3 06/02/03 - 0 5,00 0,00 209301412
0930138 4 - - 0 0,00 0,00 909301386
0973497 4 04/10/96 - 0 0,00 0,00 909734978
**********************************************************************************

file di output: file2.txt vorrei fosse composto solo da:

0116543 3 01/10/98 - 0 0,00 0,00 901165439
0116528 0 10/12/99 - 0 0,00 0,00 901165288
0983839 0 19/01/04 - 0 5,00 0,00 909838397
0226611 0 07/06/02 - 0 0,00 0,00 902266117
0896087 2 - - 0 5,00 0,00 908960875
4896083 0 29/11/99 - 0 0,00 0,00 808960836
0896053 2 - - 0 5,00 0,00 908960533
0939155 1 27/02/01 - 0 5,00 0,00 909391551
3613833 0 16/01/01 - 0 0,00 0,00 906138336
0930141 3 06/02/03 - 0 5,00 0,00 209301412
0930138 4 - - 0 0,00 0,00 909301386
0973497 4 04/10/96 - 0 0,00 0,00 909734978

senza intestazioni, asterischi, righe vuote presenti nel file1.


Il codice che ho utilizzato è il seguente:
***************************************************************************************************************

Import...ecc ecc
....
..
.
public static void main.....ecc ecc{

String path = "c:\\file1.txt;
String pathOut = "c:\\file2.txt";

File fileIn = new File(path);
File fileOut = new File(pathOut);

try{
FileReader fr = new FileReader(fileIn);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(fileOut);
BufferedWriter bw = new BufferedWriter(fw);

while(br.readLine() != null){

//Ho provato ad utilizzare StartWith ma non mi funziona bene...inoltre non vorrei selezionare
//solo le righe che iniziano per 0 ma tutte quelle che in posizione uno iniziano con un numero.

if(br.readLine().startsWith(" 0")) {
bw.write(br.readLine().substring(1,67);
}
}
br.close();
bw.close();
}
catch (Exception e){
e.printStackTrace();
}

...
..
.

Qualcuno potrebbe aiutarmi per favore?

4 Risposte

  • Re: Input/Output File di testo

    Fasyrio ha scritto:


    senza intestazioni, asterischi, righe vuote presenti nel file1.
    Allora la riga va esclusa SE dopo aver "trimmato" con trim() la stringa:
    - è vuota (lunghezza 0)
    - o inizia con "*"
    - o inizia con "codice" (se questo è certo che è sempre l'inizio di una intestazione)

    Fasyrio ha scritto:


    					while(br.readLine() != null){
    							if(br.readLine().startsWith(" 0")){
    							System.out.println(br.readLine());
    							bw.write(br.readLine());
    Questa parte NON va affatto bene. Ogni volta che fai readLine() stai "consumando" una riga. Quindi ne consumi ben 4 ad ogni ciclo.

    L' "idioma" tipico di utilizzo di readLine() è:
    String linea;
    
    while ((linea = br.readLine()) != null) {
        // qui USA linea (NON ulteriori readLine() )
    }

    La gestione delle eccezioni andrebbe migliorata, se lettura/scrittura lanciano una eccezione, i close() vanno SEMPRE fatti comunque.
  • Re: Input/Output File di testo

    Ciao andbin, grazie innanzitutto per la tua risposta.

    Quindi ho provato ad utilizzare String linea e sostituire br.readLine con line.. ok il file viene scritto ma vengono saltate le prime due righe iniziali e le ultime due righe finali..non so come mai.

    Per quanto riguarda la parte iniziale, come dovrei utilizzare trim()? In questo modo?

    String linea;
    while((linea = br.readLine()) != null) {
    if(linea.startsWith(" 0")){
    bw.write(br.readLine().trim());


    Scusami ma non ho afferrato come dovrei realizzare il costrutto if per la selezione delle linee da stampare...
  • Re: Input/Output File di testo

    Fasyrio ha scritto:


    String linea;
    while((linea = br.readLine()) != null) {
    if(linea.startsWith(" 0")){
    bw.write(br.readLine().trim());
    Continui a ripetere readLine, così ti "perdi" le righe!!!

    Credo (verifica, precisa tu) che vuoi scrivere la riga originale, non quella "trimmata". Il trim() è principalmente utile ai fini delle verifiche.
    String linea;
    
    while ((linea = br.readLine()) != null) {
        String lineaTemp = linea.trim();
    
        // qui verifichi lineaTemp (se vuota, se inizia con "*" o con codice)
    
        if ( ...... ) {    // se la linea è da scrivere
            bw.write(linea);
            bw.newLine();
        }
    }
    E nota il newLine(). readLine() scarta il newline e bw.write NON scrive alcun newline.
  • Re: Input/Output File di testo

    Ora funziona tutto alla perfezione!! Ti ringrazio, sei stato gentilissimo Buona giornata!
Devi accedere o registrarti per scrivere nel forum
4 risposte