Vai al contenuto

ūüď£ sulla piattaforma e-learning di Codice Inutile sono disponibili i miei corsi: Introduzione alla programmazione e ūüÜē Introduzione all'Arte Generativa

Leggere file CSV

ūüď¨ Per rimanere aggiornato sui prossimi articoli e su altri contenuti di creative coding, puoi iscriverti a questa newsletter. Per farlo √® sufficiente inserire il tuo indirizzo e-mail nel campo qui sotto.

Puoi leggere l'archivio qui. Powered by TinyLetter

Cominciamo il nostro percorso per imparare a lavorare con i dati: in questo post vedremo insieme come utilizzare i file di tipo CSV in Processing.

Per chi non conoscesse questo tipo di file o ci li avesse mai usati si tratta, in breve, di file di testo in cui i valori sono separati da virgole. CSV, infatti, sta per¬†comma separated values. Nella maggior parte dei casi questi file vengono esportati da Microsoft Excel, uno dei programmi pi√Ļ diffusi (e odiati) per gestire tabelle di dati.

Per dare la possibilità a chiunque mi segua sul blog di seguire gli esercizi, utilizzerò Google Sheet, alternativa gratuita e accessibile via browser del blasonato programma di Microsoft.

Ecco, quindi, il nostro primo set di dati: le statistiche metoclimatiche degli ultimi 10 anni (2008-2017) della regione Veneto, prese dal sito del Mipaaf e portate su Google Sheet.

Scarica i dati

Per esportare il file come CSV cliccate su¬†File > Scarica Come > Valori separati da virgola (.csv, foglio corrente).¬†Di seguito le immagini di come si presenta il file prima e dopo l’esportazione:

Dati in Processing: File CSV in Google Sheet
I dati visti in Google Sheet
Dati in Processing: File CSV in Atom
Gli stessi dati, esportati in CSV

Dati in un file CSV: semplice testo

Come dicevamo all’inizio, il file CSV esportato non √® altro che un file di testo contenente dei valori. Per cominciare a leggerne il contenuto √® sufficiente utilizzare la funzione¬†loadStrings(): tale funzione accetta in input un file di testo e restituisce un array di stringhe.

Prima di procedere, consiglio di rinominare il file scaricato in¬†data.csv. Non dimenticate di trascinarlo all’interno della finestra di Processing per aggiungerlo al nostro sketch.


/*
 * Leggere file CSV
 * Federico Pepe, 25.03.2018
 * http://blog.federicopepe.com/processing
 */

String[] csv;

void setup() {
  csv = loadStrings("data.csv");
  printArray(csv);
  noLoop();
}

void draw() {
}

Con queste poche righe di codice nella console ogni riga del file viene mostrata come un nuovo elemento dell’array di stringhe.

[0] "Descrizione,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017"
[1] "Temp. minima (¬įC),6.9,7.3,6.7,7.4,7.2,7.7,8.7,8,7.6,7.1"

Fino a qui niente di difficile ma a noi interessa accedere ai singoli valori presenti in ciascuna colonna. A questo punto ci torna utile riprendere gli array bidimensionali: un sistema che ci permette di rappresentare facilmente una struttura formata da righe e colonne, proprio come un file excel/csv.

Modifichiamo, dunque, il nostro codice come segue:

/*
 * Leggere file CSV
 * Federico Pepe, 25.03.2018
 * http://blog.federicopepe.com/processing
 */

String[] csv;
String[][] dati;

void setup() {
  csv = loadStrings("data.csv");
  dati = new String[csv.length][10]; 
  
  for(int i = 0; i < csv.length; i++) {
    dati[i] = csv[i].split(",");
    printArray(dati[i]);
  }
  
  noLoop();
}

void draw() {
}

Abbiamo aggiunto un array bidimensionale chiamato dati la cui dimensione è determinata dal numero di righe [csv.length] e dal numero di colonne meno uno perché si conta sempre da zero [10].

Con un semplice ciclo for accediamo a tutte le righe del file e, utilizzando la funzione .split(",") separiamo tutti i valori che sono separati dalla virgola.

Affinch√© sia tutto il pi√Ļ chiaro possibile possiamo fare un po’ di esperimenti con println inserendo nel primo valore dell’array il numero della riga e nel secondo quello della colonna.

println(dati[3][2]); restituisce il valore 0.7 che corrisponde, infatti, alla cella nella quarta riga “Scarto dal clima” e nella terza colonna “2009”.

Leggere file CSV in modo pi√Ļ semplice: Table

Siamo riusciti nel nostro intento ma credo sia ovvio che il metodo che abbiamo usato non sia il pi√Ļ congeniale.

Per nostra fortuna i creatori di Processing avevano già pensato a questa evenienza e hanno creato un oggetto specifico chiamato Table che, come è facile intuire dal nome, rappresenta già una tabella completa di righe e colonne.

Grazie ai numerosi metodi disponibili per gli oggetti di tipo Table è possibile lavorare con i dati in modo semplice e intuitivo.

Aggiorniamo il nostro codice:


/*
 * Leggere file CSV
 * Federico Pepe, 25.03.2018
 * http://blog.federicopepe.com/processing
 */

Table csv;

void setup() {
  csv = loadTable("data.csv", "header");

  println("Numero righe: " + csv.getRowCount());
  println("Numero colonne: " + csv.getColumnCount());
  
  for(int i = 0; i < csv.getRowCount(); i++) {
    println(csv.getFloat(i, 2));
  }
  
  noLoop();
}

void draw() {
}

Abbiamo sostituito i due array di stringhe con un oggetto di tipo Table chiamato csv. Attraverso la funzione loadTable() carichiamo i dati all’interno della variabile. Passando il parametro “header” stiamo dicendo a Processing di ignorare la prima riga del file che contiene l’intestazione.

Attraverso le funzioni .getRowCount() e .getColumnCount() accediamo al numero di righe e colonne del file e, infine, con il nostro ciclo for stampiamo in console i valori di tipo float contenuti nella terza colonna (quindi quelli relativi al 2009).

Conclusione

In questo post abbiamo messo molta carne al fuoco e abbiamo cominciato ad addentrarci nel mondo dei dati e dei file CSV. Assicuratevi di aver compreso bene tutte le funzioni e gli esempi inseriti in questo post prima di proseguire con la lettura del prossimo.

Articolo precedente

Coding Rescue #3 ‚Äď Cambiare la tonalit√† di alcuni pixel

Articolo successivo

Da una tabella CSV agli array

Unisciti alla discussione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.