Convertir xls en csv en QGIS con definiciones de columna correctas y exportar los datos a postgis

Aug 18 2020

Estoy usando QGIS 3.10.2 A Coruña. Después de leer este tutorial (https://ieqgis.wordpress.com/2015/02/08/importing-csv-files-into-postgresql-using-the-db-manager-in-qgis/) Pensé que finalmente había encontrado una forma sencilla de transformar xls-Data en csv y luego cargar este csv-Data en Postgis. Todas las acciones realizadas antes en Cargar datos directamente en pgAdmin fueron muy exigentes porque siempre hubo problemas al importar los datos con las definiciones de columna correctas. Al convertir xls en csv a través de qgis, todas las columnas se convierten en cadenas, lo cual es incorrecto. ¿Hay alguna idea sobre cómo las hojas de Excel se pueden transformar a csv con definiciones de columna correctas e importar con estos formatos correctos a Postgis?

Respuestas

1 bugmenot123 Aug 18 2020 at 21:25

Debe agregar un archivo csvt para que QGIS pueda leer los tipos de datos deseados desde allí.

Ver QGIS 3.2 - Forzar el tipo de columna al importar csv

Considere no usar CSV sino XLS / XLSX para que posiblemente pueda evitar todo eso.

1 DPSSpatial Aug 18 2020 at 23:38

Evitaría depender de QGIS para cargar datos CSV, especialmente dada la cantidad de datos no espaciales que es probable que tengan los CSV en los que los tipos de datos se pueden leer mal.

En su lugar, recomiendo usar CSVKit no solo para definir las columnas en las tablas que resultarán de su importación CSV, sino que luego use las funciones de PostGIS para construir los datos espaciales, etc.

CSVKit puede leer un CSV y crear una definición de columna:

csvsql -i postgresql crime.csv

Produce este resultado:

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
);

Pero aún mejor, logra lo anterior y carga el CSV en un comando:

csvsql --db postgresql://username:password@servername/databasename --table denver_crime --insert crime.csv

Aquí hay un tutorial que creé cuando necesito hacer solo esto:

https://github.com/dpsspatial/Installation-Instructions/blob/master/csvkit.md

También recomiendo usar DBeaver en lugar de PGAdmin para cualquiera de estos trabajos, ya que es una GUI mucho más fácil de usar / diseñada por analistas para su base de datos que la PGAdmin diseñada por DBA (tendré que actualizar las capturas de pantalla del tutorial - PGAdmin 3 fue OK, PGAdmin 4 es demasiado pesado y, afortunadamente, DBeaver llegó en el momento adecuado).