Estrarre dati da CSV enormi

Estrarre dati da un CSV enorme, esempio il file CSV ISTAT da oltre 3 milioni di righe.

A cura di Totò Fiandaca  | issue #171 | guida/e Andrea Borruso


Caso d’uso

L’ISTAT ha pubblicato nuovi dataset e tra questi c'è quello della popolazione residente per sesso ed età (2018 e 2019) che pesa oltre 640 MB ed ha oltre 3 milioni di righe. Vediamo come estrarre velocemente i dati che ci servono, per esempio la popolazione residente per regione geografica: ripartizione geografica, regioni, province e comuni.

Script

Un file di tali dimensioni è impossibile da gestire con programmi con interfaccia grafica, occorre necessariamente utilizzare la riga di comando. Un tool particolarmente indicato è xsv, semplice da usare, infatti questo script estrae un csv (con circa 16.000 righe) con i dati minimi per rispondere al quesito:

xsv search -d "|" -s ETA1 '^TOTAL$' Caratteristiche\ demografiche\ e\ cittadinanza\ -\ intero\ ds.csv \
| xsv search -s CITTADINANZA '^TOTAL$' \
| xsv search -s Sesso '^totale$' \
| xsv search -s 'Tipo dato' '^popolazione residente$' >./output.csv

dove:

  • -d imposta il separatore di campi;
  • -s imposta i campi da cercare;

il file CSV risultante è filtrato per valori, per filtrarlo anche per campi occorre aggiungere:

xsv select ITTER107,Territorio,TIME,Value

restituisce solo i campi elencati dopo il select;

oppure, se volessimo ottenere direttamente i 4 CSV (ripartizione geografica, regioni, province e comuni), basta lanciare questo script:

#!/bin/bash

# estrae le ripartizioni geografiche per il 2019
xsv search -d "|" -s ETA1 '^TOTAL$' Caratteristiche\ demografiche\ e\ cittadinanza\ -\ intero\ ds.csv \
 | xsv search -s CITTADINANZA '^TOTAL$' \
 | xsv search -s Sesso '^totale$'  \
 | xsv search -s 'Tipo dato' '^popolazione residente$' \
 | xsv search -s 'ITTER107' '^IT.$'  \
 | xsv search -s 'TIME' '2019' \
 | xsv select ITTER107,Territorio,TIME,Value>./pop_res_ISTAT19_rip.csv

# estrae le regioni per il 2019
 xsv search -d "|" -s ETA1 '^TOTAL$' Caratteristiche\ demografiche\ e\ cittadinanza\ -\ intero\ ds.csv \
 | xsv search -s CITTADINANZA '^TOTAL$' \
 | xsv search -s Sesso '^totale$'  \
 | xsv search -s 'Tipo dato' '^popolazione residente$' \
 | xsv search -s 'ITTER107' '^IT..$'  \
 | xsv search -s 'TIME' '2019' \
 | xsv select ITTER107,Territorio,TIME,Value>./pop_res_ISTAT19_reg.csv

# estrae le province per il 2019
xsv search -d "|" -s ETA1 '^TOTAL$' Caratteristiche\ demografiche\ e\ cittadinanza\ -\ intero\ ds.csv \
 | xsv search -s CITTADINANZA '^TOTAL$' \
 | xsv search -s Sesso '^totale$'  \
 | xsv search -s 'Tipo dato' '^popolazione residente$' \
 | xsv search -s 'ITTER107' '^IT...$'  \
 | xsv search -s 'TIME' '2019' \
 | xsv select ITTER107,Territorio,TIME,Value>./pop_res_ISTAT19_prov.csv

# estrae i comuni per il 2019
 xsv search -d "|" -s ETA1 '^TOTAL$' Caratteristiche\ demografiche\ e\ cittadinanza\ -\ intero\ ds.csv \
 | xsv search -s CITTADINANZA '^TOTAL$' \
 | xsv search -s Sesso '^totale$'  \
 | xsv search -s 'Tipo dato' '^popolazione residente$' \
 | xsv search -s 'ITTER107' '^\d.*'  \
 | xsv search -s 'TIME' '2019' \
 | xsv select ITTER107,Territorio,TIME,Value>./pop_res_ISTAT19_com.csv

Output

  • file CSV ripartizioni geografiche ISTAT
ID ITTER107 Territorio TIME Value
1 ITC Nord-ovest 2019 15988679
2 ITD Nord-est 2019 11627537
3 ITE Centro 2019 11831092
4 ITF Sud 2019 13707269
5 ITG Isole 2019 6486911

Riferimenti utili

Ultima modifica 18/12/2020: update (4790bbc)