Merge file di testo

di il
2 risposte

Merge file di testo

Buonasera a tutti,

Sintesi del problema:
ho due file di testo, file1 e file2, vorrei scrivere in un terzo file, file3, le righe di file1 concatenate a quelle di file2 laddove sussista una corrispondenza tra le righe dei due file.

Descrizione:
file1 è composto ad esempio dalle seguente righe:

codice descrizione prezzo

00000 AAAAAAA 1,00
00001 BBBBBBBB 2,00
00002 CCCCCCC 3,00
...
..
.

file2 è composto ad esempio dalle seguenti righe:

ubicazione descrizione giacenza

A1 AAAAAAA 5
B1 BBBBBBBB 6
Z1 ZZZZZZZZ 3
C1 CCCCCCC 7
...
..
.

il file3 dovrebbe essere il seguente:

codice descrizione prezzo ubicazione giacenza

00000 AAAAAAA 1,00 A1 5
00001 BBBBBBBB 2,00 B1 6
00002 CCCCCCC 3,00 C1 7

Come ho agito:
Ho letto il primo file e ho salvato tutte le righe dentro un ArrayList arr1. Ho fatto la stessa cosa per il file2 salvando le righe su un ArrayList arr2.
Ho messo a confronto le righe del primo file con il secondo e ho provato a scrivere sul terzo file le righe del file1+le righe del file2 laddove la descrizione tra i due file fosse stata identica.
Se utilizzo System.out.println per visualizzare il risultato all'interno della console, ottengo l'output desiderato sebbene mi venga generato un errore Out of string...(76) che corrisponde alla fine del substring (il file esiste in quel punto!). Mentre se cerco di scrivere non ottengo nessun output.
Potreste darmi una mano per favore?

Codice

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

public class Test {
public static void main(String args[]){

String path1 = "c:\\test\\file1.txt";
String path2 = "c:\\test\\file2.txt";
String path3 = "c:\\test\\file3.txt";

File file1 = new File(path1);
File file2 = new File(path2);
File file3 = new File(path3);

try{
FileReader fr = new FileReader(file1);
BufferedReader br = new BufferedReader(fr);
String line;
ArrayList<String> arr1 = new ArrayList<String>();
while((line = br.readLine()) != null){

arr1.add(line);
}

fr.close();
br.close();

/* TEST STAMPA ARRAY 1 (OK VIENE STAMPATO CORRETTAMENTE)
for( int i =0; i<arr1.size();i++){
System.out.println(arr1.get(i).substring(77,97));
}
*/

FileReader fr2 = new FileReader(file2);
BufferedReader br2 = new BufferedReader(fr2);
String line2;
ArrayList<String> arr2 = new ArrayList<String>();

while((line2 = br2.readLine()) != null){
arr2.add(line2);
}
fr2.close();
br2.close();

/* TEST STAMPA ARRAY 2 (OK VIENE STAMPATO CORRETTAMENTE)
for(int i = 0; i<arr2.size();i++){
System.out.println(arr2.get(i).substring(0,20));
}
*/

//CONFRONTO GLI ARRAY
FileWriter fw = new FileWriter(file3);
BufferedWriter bw = new BufferedWriter(fw);

for (int i = 0; i<arr1.size();i++){
String linea1 = arr1.get(i).substring(77,97);
for(int j=0; j<arr2.size();j++){
String linea2 = arr2.get(j).substring(0,20);
if(linea2.equals(linea1)){

bw.write(linea1+linea2);
}
}
}
br.close()
}

catch (Exception e){
e.printStackTrace();
System.out.println("Si è verificato qualche problema");
}

}
}

2 Risposte

  • Re: Merge file di testo

    Il procedimento che hai seguito non mi sembra logicamente sbagliato, certo se hai file molto lunghi confrontare ogni riga di file1 con tutte quelle di file2 potrebbe essere un po' oneroso ...

    Per quanto riguarda il tuo codice alcune cose potrebbero essere migliorate: in primis la gestione dei try catch per leggere i file.
    Intanto non serve richiamare il metodo close contemporaneamente sul BufferedReader e sul FileReader, ti basta chiudere il BufferedReader, ma soprattutto la chiusura dovrebbe avvenire in un blocco finally, perché se il tuo programma fallisce con un'eccezione il close () non viene richiamato.

    Se vuoi puoi da Java 7 puoi evitare di occuparti della chiusura utilizzando il try-with-resources (fai una piccola ricerca su google ).

    Altra cosa che non va è cosa scrivi su file3 : confronti linea1 con linea2, che sono le parti che ti aspetti siano uguali (descrizione?), e poi scrivi due volte linea1 (che se entri nell'if sarà uguale a linea2).
    Ma tu in file3 volevi scrivere tutte le informazioni dei due file, ti stai perdendo pezzi...

    [quote=Fasyrio]Se utilizzo System.out.println per visualizzare il risultato all'interno della console, ottengo l'output desiderato[/quote]

    Quale ouput desiderato ? Nel tuo codice stampi solo i due arraylist, che hanno correttamente all'interno le righe dei file. Hai fatto dei println () anche per controllare che ci siano corrispondenze nelle descrizioni ? Ma anche se ci fossero con quel codice non ottieni l'ouput voluto ...

    Per quanto riguarda gli indici delle stringhe, senza avere i file di testo non possiamo sapere se e quando il substring ti lancia una StringIndexOutOfBoundsException (immagino intendessi quello con out of string).
    In generale non è una gran bellezza sbattere dentro i valori in substring senza controllare che gli indici esistano prima (controllando laTuaStringa.length () adeguatamente) o senza catturare un'eccezione espressamente.
    Lo puoi fare se sei SICURO che il tuo file sia formattato sempre in un certo modo e che quegli indici siano sempre corretti (ma pare non sia questo il caso).

    Per aiutarci ad aiutarti, senza postare inutilmente file1 e file2, potresti aggiungere "manualmente" nelle due arraylist rappresentanti le righe del file 2 3 righe per ogni file, così controlliamo se e dove fallisce il confonto. Ad esempio :
    
    ArrayList<String> arr1 = new ArrayList<String>();
    arr1.add ("00000 AAAAAAA 1,00");
    arr1.add ("00001 BBBBBBBB 2,00");
    ArrayList<String> arr2 = new ArrayList<String>();
    arr2.add ("A1 AAAAAAA 5");
    arr2.add ("B1 BBBBBBBB 6");
    
    Ovviamente metti le righe "vere", visto che utilizzi indici fino a 90 e passa nel tuo codice. Una volta fatto il confronto e capito dove sbagli (ma dovresti avere già un'idea di cosa non vada) puoi ricominciare a leggere da file le tue righe.

    PS: utilizza i tag
     (aperto e poi chiuso con /) per racchiudere il codice che posti nel forum
  • Re: Merge file di testo

    Ansharja ha scritto:


    Il procedimento che hai seguito non mi sembra logicamente sbagliato, certo se hai file molto lunghi confrontare ogni riga di file1 con tutte quelle di file2 potrebbe essere un po' oneroso ...

    Per quanto riguarda il tuo codice alcune cose potrebbero essere migliorate: in primis la gestione dei try catch per leggere i file.
    Intanto non serve richiamare il metodo close contemporaneamente sul BufferedReader e sul FileReader, ti basta chiudere il BufferedReader, ma soprattutto la chiusura dovrebbe avvenire in un blocco finally, perché se il tuo programma fallisce con un'eccezione il close () non viene richiamato.

    Se vuoi puoi da Java 7 puoi evitare di occuparti della chiusura utilizzando il try-with-resources (fai una piccola ricerca su google ).
    ........................
    .............
    ....
    Ansharja scusa se ho tardato a rispondere, dopo aver letto con attenzione i tuoi consigli mi sono messo all'opera per cercare di risolvere il problema...grazie mille davvero gentilissimo!!

    Agg. code:
    eliminato fr.close.
    inserito il finally alla fine di try & Catch.
    Inserito controllo lunghezza linea.
    Corretti indici stampa finale.
    
    package it.main;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    
    public class Test {
    	public static void main(String args[]) throws IOException{
    		
    		String path1 = "c:\\test\\file1.txt";
    		String path2 = "c:\\test\\file2.txt";
    		String path3 = "c:\\test\\file3.txt";
    		
    		File file1 = new File(path1);
    		File file2 = new File(path2);
    		File file3 = new File(path3);
    		
    		FileReader fr = new FileReader(file1);
    		BufferedReader br = new BufferedReader(fr);
    		
    		FileReader fr2 = new FileReader(file2);	
    		BufferedReader br2 = new BufferedReader(fr2);
    		
    		FileWriter fw = new FileWriter(file3);
    		BufferedWriter bw = new BufferedWriter(fw);
    		
    		try{
    			String line;
    			ArrayList<String> arr1 = new ArrayList<String>();
    				while((line = br.readLine()) != null){
    					arr1.add(line);
    				}
    			br.close();
    
    			String line2;
    			ArrayList<String> arr2 = new ArrayList<String>();
    				
    			while((line2 = br2.readLine()) != null){
    					arr2.add(line2);
    				}
    			
    				br2.close();
    			
    			for(int i =0; i<arr1.size();i++){
    				String linea1 = "";
    				if(arr1.get(i).length() >= 87){
    				linea1 = arr1.get(i).substring(77,87);
    				}
    				for(int j=0;j<arr2.size();j++){
    					String linea2 = "";
    					if(arr2.get(j).length()>= 11){
    					linea2 = arr2.get(j).substring(1,11);
    					}
    			
    					if(linea1.equals(linea2)){
    						//System.out.println(arr1.get(i).substring(66,76)+" "+ arr2.get(j));
    						bw.write(arr1.get(i).substring(66,76)+arr2.get(j));
    						bw.newLine();
    					}
    				}
    			}
    			bw.close();
    			
    		}
    		catch (Exception e){
    			e.printStackTrace();
    			System.out.println("Si è verificato qualche problema");
    		}
    		finally{
    			br.close();
    			br2.close();
    			bw.close();
    		}
    	}
    }
    
    A presto e buona giornata a tutti!
Devi accedere o registrarti per scrivere nel forum
2 risposte