fileCSV

un formato comune per lo scambio dei dati

Testi separati da virgole

Molto spesso le informazioni si trovano salvate in file che hanno una formato chiamato csv (Comma Separated Values) che possiamo ottenere anche salvando i dati presenti in un foglio di calcolo.

Questi file rappresentano una tabella in cui i dati di ogni colonna sono separati da una virgola e in cui tutte le righe hanno lo stesso numero di colonne (NB: una riga vuota rappresenterebbe una ulteriore riga di dati ma con zero colonne).

Prendiamo come esempio un file in cui registriamo le nostre spese: ogni riga contiene in sequenza una data, descrizione, denaro entrato, denaro uscito. Ad esempio le prime tre righe sono:

10-8-2017,pizzeria,0,25
11-8-2017,regalo,50,0
10-8-2017,pizzeria,0,35

Dovremmo ora costruire un programma che leggendo una riga alla volta scriva poi il totale delle entrate e delle uscite.

public class CommaSeparatedValues extends Application{
  TextField cIngressi = new TextField();
  TextField cUscite = new TextField();
  Label eErrori = new Label("-");

  @Override
  public void start(Stage primaryStage) throws Exception {
    Label eIngressi = new Label("ingressi:");
    Label eUscite = new Label("uscite:");
    GridPane pannello = new GridPane();
    Button contabilizza = new Button("contabilizza");
        
    pannello.add(eIngressi, 0, 0);
    pannello.add(cIngressi, 1, 0);
    pannello.add(eUscite, 0, 1);
    pannello.add(cUscite, 1, 1);
    pannello.add(contabilizza, 0, 3);
    pannello.add(eErrori, 1, 3);
        
    Scene scena = new Scene(pannello);
    primaryStage.setScene(scena);
    primaryStage.setTitle("contabilità");
    primaryStage.show();
        
    contabilizza.setOnAction(e->calcolaSomme());
  }
    
  public void calcolaSomme() {
    String riga;
    String parti[];
    int ingresso = 0;
    int uscita = 0;
    try(
      FileInputStream fis = new FileInputStream("/Users/edoardo/Desktop/spese.txt");
      InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
      BufferedReader input = new BufferedReader(isr);
    ){
      while( (riga=input.readLine()) != null ) {
        parti = riga.split(",");
        ingresso += Integer.parseInt(parti[2]);
        uscita += Integer.parseInt(parti[3]);
      }
      cIngressi.setText(""+ingresso);
      cUscite.setText(""+uscita);
    } catch (NumberFormatException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
     
  public static void main(String args[]){
    launch();
  }
}

In questo caso nella creazione dell'InputStreamReader abbiamo specificato anche la codifica dei caratteri.

Nel programma qui sopra ho aperto un FileOutputStream ma non ho usato close() dopo aver letto... perché?

dimenticanza no, fatto appositamente ho usato un try-with-resources si! visibile dalle tonde dopo la parola chiave try non è necessario no, potrei perdere dati che volevo salvare