Salta al contenuto principale

Come leggere file csv con Java

Profile picture for user luca77king

Lavorare con i file CSV (Comma Separated Value) è una delle attività più comuni che gli sviluppatori devono svolgere. Java non fa eccezione e in questa lezione vi fornirò una panoramica completa di come questo compito può essere svolto utilizzando due metodi nativi di questo linguaggio. Esploreremo i due metodi di lettura dei file, tenendo conto di fattori importanti come l'ottimizzazione delle prestazioni e l'utilizzo della memoria. Alla fine di questo articolo, avrete una comprensione completa di come analizzare i vostri file CSV in pochissimo tempo. 

Nella nostra lezione andremo a leggere un file chiamato “dati.csv” contenente tre colonne "CODICE CLIENTE", "IMPORTO SPESA" e "DATA ULTIMA SPESA".

Utilizzare la classe BufferedReader

Per leggere un file CSV in Java, è possibile utilizzare la classe BufferedReader in combinazione con la classe FileReader per leggere il contenuto del file riga per riga e quindi suddividere ogni riga in colonne utilizzando la funzione split della classe String.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;

public class Main {
    public static void main(String[] args) {
        String filePath = new File("./resources/dati.csv").getAbsolutePath();
        boolean isFirstLine = true;

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                if (isFirstLine) {
                    isFirstLine = false;
                    continue;
                }

                String[] columns = line.split(";");
                String customerCode = columns[0];
                String purchaseAmount = columns[1];
                String lastPurchaseDate = columns[2];

                System.out.println("CODICE CLIENTE: " + customerCode + ", IMPORTO SPESA: " + purchaseAmount + ", DATA ULTIMA SPESA: " + lastPurchaseDate);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

La classe BufferedReader viene utilizzata per leggere il contenuto del file riga per riga. La funzione readLine viene utilizzata per leggere ogni riga del file fino a quando non viene raggiunta la fine del file.

Per ogni riga del file, utilizziamo la funzione split per suddividere la riga in colonne basate sul carattere di separazione ";". Ogni colonna viene quindi assegnata a una variabile specifica e viene stampata a video.

Nel codice, abbiamo introdotto una variabile booleana isFirstLine che tiene traccia se la riga corrente è la prima riga del file. Se la riga corrente è la prima riga del file, impostiamo isFirstLine su false e saltiamo alla riga successiva utilizzando la keyword continue. In questo modo, la prima riga del file viene ignorata.


Utilizzare la classe Scanner 

Un'alternativa per leggere un file CSV in Java consiste nell'utilizzare la classe Scanner. Per utilizzare questo metodo, è necessario importare nel progetto il pacchetto java.util, che include la classe Scanner. Una volta fatto ciò, è possibile creare un'istanza della classe Scanner e aprire il file CSV. 

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String filePath = new File("./resources/dati.csv").getAbsolutePath();
        boolean isFirstLine = true;

        try (Scanner scanner = new Scanner(new File(filePath))) {
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();

                if (isFirstLine) {
                    isFirstLine = false;
                    continue;
                }

                String[] columns = line.split(";");
                String customerCode = columns[0];
                String purchaseAmount = columns[1];
                String lastPurchaseDate = columns[2];

                System.out.println("CODICE CLIENTE: " + customerCode + ", IMPORTO SPESA: " + purchaseAmount + ", DATA ULTIMA SPESA: " + lastPurchaseDate);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

In questo codice, abbiamo creato un oggetto Scanner per leggere il file e utilizzato il metodo hasNextLine() per verificare se ci sono altre righe da leggere. Ad ogni iterazione, leggiamo una riga utilizzando il metodo nextLine() e gestiamo l'ignorare la prima riga del file allo stesso modo come nel codice precedente.

Per il resto, il codice funziona allo stesso modo come nel codice precedente, con ogni riga del file che viene suddivisa in colonne e ogni colonna che viene assegnata a una variabile specifica e stampata a video.

Conclusione

La lettura di file CSV (Comma Separated Value) in Java può essere effettuata anche sfruttando librerie esterne come OpenCSV o Apache Commons CSV, ma questo lo vedremo quando tratteremo Maven. In questa lezione, abbiamo visto come leggere file CSV in Java utilizzando gli strumenti nativi del linguaggio e abbiamo anche discusso alcuni dei problemi comuni che si possono incontrare quando si lavora con i file CSV.