Conversione di xls in csv in QGIS con le definizioni di colonna corrette ed esportazione dei dati in postgis
Sto usando QGIS 3.10.2 A Coruna. Dopo aver letto questo tutorial (https://ieqgis.wordpress.com/2015/02/08/importing-csv-files-into-postgresql-using-the-db-manager-in-qgis/) Pensavo di aver finalmente trovato un modo semplice per trasformare xls-Data in csv e quindi caricare questi csv-Data in Postgis. Tutte le azioni intraprese prima in Caricamento dei dati direttamente in pgAdmin erano molto faticose perché c'erano sempre problemi con l'importazione dei dati con le corrette definizioni di colonna. Quando si converte xls in csv tramite qgis, tutte le colonne vengono convertite in stringhe, il che non è corretto. Hai qualche idea su come trasformare i fogli Excel in csv con le definizioni di colonna corrette e importarli con questi formati corretti in Postgis?
Risposte
Devi aggiungere un file csvt in modo che QGIS possa leggere i tipi di dati previsti da lì.
Vedi QGIS 3.2 - Forzare il tipo di colonna durante l'importazione di csv
Considera di non usare CSV ma invece XLS / XLSX in modo da poter evitare tutto ciò.
Eviterei di dipendere da QGIS per caricare i dati CSV, soprattutto data la quantità di dati non spaziali che è probabile che i CSV abbiano in cui i tipi di dati possono essere letti in modo errato.
Invece, consiglio di utilizzare CSVKit non solo per definire le colonne nelle tabelle che risulteranno dall'importazione CSV, ma quindi utilizzare le funzioni PostGIS per creare i dati spaziali, ecc.
CSVKit può leggere un CSV e creare una definizione di colonna:
csvsql -i postgresql crime.csv
Produce questo risultato:
CREATE TABLE crime (
"INCIDENT_ID" FLOAT NOT NULL,
"OFFENSE_ID" BIGINT NOT NULL,
"OFFENSE_CODE" VARCHAR(4) NOT NULL,
"OFFENSE_CODE_EXTENSION" INTEGER NOT NULL,
"OFFENSE_TYPE_ID" VARCHAR(30) NOT NULL,
"OFFENSE_CATEGORY_ID" VARCHAR(28) NOT NULL,
"FIRST_OCCURRENCE_DATE" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
"LAST_OCCURRENCE_DATE" TIMESTAMP WITHOUT TIME ZONE,
"REPORTED_DATE" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
"INCIDENT_ADDRESS" VARCHAR(97),
"GEO_X" FLOAT NOT NULL,
"GEO_Y" FLOAT NOT NULL,
"GEO_LON" FLOAT,
"GEO_LAT" FLOAT,
"DISTRICT_ID" INTEGER,
"PRECINCT_ID" INTEGER,
"NEIGHBORHOOD_ID" VARCHAR(26),
"IS_CRIME" INTEGER NOT NULL,
"IS_TRAFFIC" INTEGER NOT NULL
);
Ma ancora meglio, esegui quanto sopra e carichi il CSV in un comando:
csvsql --db postgresql://username:password@servername/databasename --table denver_crime --insert crime.csv
Ecco un tutorial che ho creato quando ho bisogno di fare proprio questo:
https://github.com/dpsspatial/Installation-Instructions/blob/master/csvkit.md
Consiglio anche di utilizzare DBeaver invece di PGAdmin per qualsiasi di questo lavoro, poiché è una GUI molto più user-friendly / progettata dagli analisti per il tuo database rispetto al PGAdmin progettato da DBA (dovrò aggiornare gli screenshot del tutorial - PGAdmin 3 era OK, PGAdmin 4 è troppo pesante e fortunatamente DBeaver è arrivato per noi al momento giusto).