opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

mlr parse error #211

Closed dennisangemi closed 2 years ago

dennisangemi commented 2 years ago

Buonasera! Volevo scaricare un file csv da istat utilizzando questo script

#!/bin/bash

# download data
curl -kL "https://demo.istat.it/bil2019/dati/Enna.zip" > ../data/bil2019.zip

# unzip
unzip -o ../data/bil2019.zip -d ../data/

# delete zip
rm ../data/bil2019.zip

# go to data folder
cd ../data/

# data cleaning
# rm first two line of text file
tail -n +3 Enna.csv > t-Enna.csv
mv t-Enna.csv Enna.csv

# select 1-21 line
head -21 Enna.csv > t-Enna.csv
mv t-Enna.csv Enna.csv

Arrivato a questo punto ho il file Enna.csv che però pare non essere sano. Se lancio mlr --csv check Enna.csv ottengo:

mlr :  parse error on line 1, column 14: extraneous or missing " in quoted-field`

ma non capisco cosa abbia di strano. Qui di seguito una sorta di head.


"Codice comune";"Comune";"Popolazione al 1° gennaio - Maschi";"Popolazione al 1° gennaio - Femmine";"Popolazione al 1° gennaio - Totale";"Nati - Maschi";"Nati - Femmine";"Nati - Totale";"Morti - Maschi";"Morti - Femmine";"Morti - Totale";"Saldo naturale - Maschi";"Saldo naturale - Femmine";"Saldo naturale - Totale";"Iscritti da altri comuni - Maschi";"Iscritti da altri comuni - Femmine";"Iscritti da altri comuni - Totale";"Iscritti dall'estero - Maschi";"Iscritti dall'estero - Femmine";"Iscritti dall'estero - Totale";"Altri iscritti - Maschi";"Altri iscritti - Femmine";"Altri iscritti - Totale";"Cancellati per altri comuni - Maschi";"Cancellati per altri comuni - Femmine";"Cancellati per altri comuni - Totale";"Cancellati per l'estero - Maschi";"Cancellati per l'estero - Femmine";"Cancellati per l'estero - Totale";"Altri cancellati - Maschi";"Altri cancellati - Femmine";"Altri cancellati - Totale";"Saldo migratorio estero - Maschi";"Saldo migratorio estero - Femmine";"Saldo migratorio estero - Totale";"Unità in più/meno dovute a variazioni territoriali - Maschi";"Unità in più/meno dovute a variazioni territoriali - Femmine";"Unità in più/meno dovute a variazioni territoriali - Totale";"Aggiustamento statistico censuario totale - Maschi";"Aggiustamento statistico censuario totale - Femmine";"Aggiustamento statistico censuario totale - Totale";"Popolazione al 31 dicembre da censimento - Maschi";"Popolazione al 31 dicembre da censimento - Femmine";"Popolazione al 31 dicembre da censimento - Totale";"Popolazione residente in famiglia da censimento - Maschi";"Popolazione residente in famiglia da censimento - Femmine";"Popolazione residente in famiglia da censimento - Totale";"Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Maschi";"Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Femmine";"Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Totale";"Numero di famiglie al 31 dicembre da censimento";"Numero di convivenze al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica";"Numero medio di componenti per famiglia al 31 dicembre da censimento"
"086001";"Agira";3951;4061;8012;26;28;54;44;56;100;-18;-28;-46;23;28;51;15;10;25;0;0;0;62;35;97;10;13;23;5;3;8;5;-3;2;0;0;0;0;2;2;3894;4022;7916;3883;4015;7898;11;7;18;;3;

Cosa sbaglio? Grazie in anticipo ;)

aborruso commented 2 years ago

Caro @dennisangemi non gli hai detto il separatore di campo. Prova con

mlr --csv --ifs ";" check Enna.csv
dennisangemi commented 2 years ago

Grazie mille @aborruso , effettivamente lanciando

mlr --csv --ifs ";" check Enna.csv

il csv risulta ok.

Ho quindi rimosso le virgolette e sostituito i ; con , così

# remove quotation
sed 's/"//g' Enna.csv > t-Enna.csv
mv t-Enna.csv Enna.csv

# substitute ; with ,
sed 's/;/,/g' Enna.csv > t-Enna.csv
mv t-Enna.csv Enna.csv

c'è un modo più ortodosso?

aborruso commented 2 years ago

c'è un modo più ortodosso?

Miller non ama i CSV brutti, quindi basta usarlo :)

Prova mlr --csv --ifs ";" cat input.csv e non avrai più le " e il separatore sarà la ,.

Puoi anche andare in sovra scrittura con mlr -I --csv --ifs ";" cat input.csv

dennisangemi commented 2 years ago

Wow! Fantastico! Grazie ancora @aborruso . Terrò presente l'espressione mlr -I --csv --ifs ";" cat input.csv.

Per me possiamo chiudere. Secondo te è necessario chiudere ricetta? Abbiamo toccato tanti temi.

aborruso commented 2 years ago

Per me possiamo chiudere. Secondo te è necessario chiudere ricetta? Abbiamo toccato tanti temi.

Ma scusami, una ricetta "come modificare separatore di campi e rimuovere eventuali virgolette ridondanti in un CSV?" non è cosa utile e correlata?

dennisangemi commented 2 years ago

Assolutamente sì. Scrivo appena ho 2 min di tempo.

dennisangemi commented 2 years ago

Bozza post | Template

@aborruso che te ne pare?


title: "Come modificare separatore di campo e rimuovere eventuali virgolette ridondanti in un CSV" linkTitle: "Modificare delimiter e rimuovere virgolette" date: 2022-04-22 description: > Ecco come modificare il separatore di campo e rimuovere eventuali virgolette ridondanti in un file di dati CSV utilizzando la utility Miller tags:


I file in formato CSV sono i più usati per la condivisione di dati strutturati. In generale consistono in file di testo in cui i campi del dataset sono separati da virgole così come lo stesso acronimo in inglese suggerisce (Comma Separated Values).

Di seguito un banalissimo esempio di file CSV

Codice comune,Comune
086001,Agira

Alle volte, come in questo dataset di ISTAT, è possibile che:

Ecco le prime righe del dataset precedentemente citato:

"Codice comune";"Comune";"Popolazione al 1° gennaio - Maschi";"Popolazione al 1° gennaio - Femmine";"Popolazione al 1° gennaio - Totale";"Nati - Maschi";"Nati - Femmine";"Nati - Totale";"Morti - Maschi";"Morti - Femmine";"Morti - Totale";"Saldo naturale - Maschi";"Saldo naturale - Femmine";"Saldo naturale - Totale";"Iscritti da altri comuni - Maschi";"Iscritti da altri comuni - Femmine";"Iscritti da altri comuni - Totale";"Iscritti dall'estero - Maschi";"Iscritti dall'estero - Femmine";"Iscritti dall'estero - Totale";"Altri iscritti - Maschi";"Altri iscritti - Femmine";"Altri iscritti - Totale";"Cancellati per altri comuni - Maschi";"Cancellati per altri comuni - Femmine";"Cancellati per altri comuni - Totale";"Cancellati per l'estero - Maschi";"Cancellati per l'estero - Femmine";"Cancellati per l'estero - Totale";"Altri cancellati - Maschi";"Altri cancellati - Femmine";"Altri cancellati - Totale";"Saldo migratorio estero - Maschi";"Saldo migratorio estero - Femmine";"Saldo migratorio estero - Totale";"Unità in più/meno dovute a variazioni territoriali - Maschi";"Unità in più/meno dovute a variazioni territoriali - Femmine";"Unità in più/meno dovute a variazioni territoriali - Totale";"Aggiustamento statistico censuario totale - Maschi";"Aggiustamento statistico censuario totale - Femmine";"Aggiustamento statistico censuario totale - Totale";"Popolazione al 31 dicembre da censimento - Maschi";"Popolazione al 31 dicembre da censimento - Femmine";"Popolazione al 31 dicembre da censimento - Totale";"Popolazione residente in famiglia da censimento - Maschi";"Popolazione residente in famiglia da censimento - Femmine";"Popolazione residente in famiglia da censimento - Totale";"Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Maschi";"Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Femmine";"Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Totale";"Numero di famiglie al 31 dicembre da censimento";"Numero di convivenze al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica";"Numero medio di componenti per famiglia al 31 dicembre da censimento"
"086001";"Agira";3951;4061;8012;26;28;54;44;56;100;-18;-28;-46;23;28;51;15;10;25;0;0;0;62;35;97;10;13;23;5;3;8;5;-3;2;0;0;0;0;2;2;3894;4022;7916;3883;4015;7898;11;7;18;;3;

Generalmente non è necessario utilizzare le virgolette " se non sono presenti caratteri speciali (e.g. newline character) o virgole che non hanno lo scopo di delimitare i campi. Pertanto, immaginando che il file sul quale stiamo lavorando sia denominato input.csv, è possibile utilizzare la utility Miller per ottenere un "vero" CSV a partire dall'esempio di istat. Sarà sufficiente lanciare il seguente comando da terminale

mlr -I --csv --ifs ";" cat input.csv

per ottenere in output un file come questo

Codice comune,Comune,Popolazione al 1° gennaio - Maschi,Popolazione al 1° gennaio - Femmine,Popolazione al 1° gennaio - Totale,Nati - Maschi,Nati - Femmine,Nati - Totale,Morti - Maschi,Morti - Femmine,Morti - Totale,Saldo naturale - Maschi,Saldo naturale - Femmine,Saldo naturale - Totale,Iscritti da altri comuni - Maschi,Iscritti da altri comuni - Femmine,Iscritti da altri comuni - Totale,Iscritti dall'estero - Maschi,Iscritti dall'estero - Femmine,Iscritti dall'estero - Totale,Altri iscritti - Maschi,Altri iscritti - Femmine,Altri iscritti - Totale,Cancellati per altri comuni - Maschi,Cancellati per altri comuni - Femmine,Cancellati per altri comuni - Totale,Cancellati per l'estero - Maschi,Cancellati per l'estero - Femmine,Cancellati per l'estero - Totale,Altri cancellati - Maschi,Altri cancellati - Femmine,Altri cancellati - Totale,Saldo migratorio estero - Maschi,Saldo migratorio estero - Femmine,Saldo migratorio estero - Totale,Unità in più/meno dovute a variazioni territoriali - Maschi,Unità in più/meno dovute a variazioni territoriali - Femmine,Unità in più/meno dovute a variazioni territoriali - Totale,Aggiustamento statistico censuario totale - Maschi,Aggiustamento statistico censuario totale - Femmine,Aggiustamento statistico censuario totale - Totale,Popolazione al 31 dicembre da censimento - Maschi,Popolazione al 31 dicembre da censimento - Femmine,Popolazione al 31 dicembre da censimento - Totale,Popolazione residente in famiglia da censimento - Maschi,Popolazione residente in famiglia da censimento - Femmine,Popolazione residente in famiglia da censimento - Totale,Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Maschi,Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Femmine,Popolazione residente in convivenza al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica - Totale,Numero di famiglie al 31 dicembre da censimento,Numero di convivenze al 31 dicembre da trattamento statistico dell'informazione di fonte anagrafica,Numero medio di componenti per famiglia al 31 dicembre da censimento
086001,Agira,3951,4061,8012,26,28,54,44,56,100,-18,-28,-46,23,28,51,15,10,25,0,0,0,62,35,97,10,13,23,5,3,8,5,-3,2,0,0,0,0,2,2,3894,4022,7916,3883,4015,7898,11,7,18,,3,

Note

Riferimenti

aborruso commented 2 years ago

@dennisangemi non ti resta che pubblicarla 🔥

dennisangemi commented 2 years ago

@aborruso appena fatto! Grazie per la benedizione ;) https://github.com/opendatasicilia/tansignari-md/commit/b54a026320c0cbc68bd191177f4f7b4ad44d0146