Conversion de xls en csv dans QGIS avec des définitions de colonne correctes et exportation des données dans postgis
J'utilise QGIS 3.10.2 A Coruna. Après avoir lu ce tutoriel (https://ieqgis.wordpress.com/2015/02/08/importing-csv-files-into-postgresql-using-the-db-manager-in-qgis/) Je pensais avoir enfin trouvé un moyen simple de transformer xls-Data en csv, puis de charger ce csv-Data dans Postgis. Toutes les actions prises auparavant lors du chargement des données directement dans pgAdmin étaient très contraignantes car il y avait toujours des problèmes lors de l'importation des données avec les défitions de colonne correctes. Lors de la conversion de xls en csv via qgis, toutes les colonnes sont converties en chaînes, ce qui est incorrect. Y a-t-il des idées sur la façon dont les feuilles Excel peuvent être transformées en csv avec des définitions de colonnes correctes et importées avec ces formats corrects dans Postgis?
Réponses
Vous devez ajouter un fichier csvt pour que QGIS puisse lire les types de données prévus à partir de là.
Voir QGIS 3.2 - Forcer le type de colonne lors de l'importation de csv
Envisagez de ne pas utiliser CSV mais plutôt XLS / XLSX afin d'éviter tout cela.
J'éviterais de dépendre de QGIS pour charger des données CSV, en particulier étant donné la quantité de données non spatiales que les CSV sont susceptibles d'avoir dans lesquelles les types de données peuvent être mal lus.
Au lieu de cela, je recommande d'utiliser CSVKit non seulement pour définir les colonnes dans les tables qui résulteront de votre importation CSV, mais aussi d'utiliser les fonctions PostGIS pour créer les données spatiales, etc.
CSVKit peut lire un CSV et créer une définition de colonne:
csvsql -i postgresql crime.csv
Donne ce résultat:
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
);
Mais encore mieux, vous accomplissez ce qui précède et chargez le CSV en une seule commande:
csvsql --db postgresql://username:password@servername/databasename --table denver_crime --insert crime.csv
Voici un tutoriel que j'ai créé lorsque j'ai besoin de faire exactement cela:
https://github.com/dpsspatial/Installation-Instructions/blob/master/csvkit.md
Je recommande également d'utiliser DBeaver au lieu de PGAdmin pour tout ce travail, car il s'agit d'une interface graphique beaucoup plus conviviale / conçue par un analyste pour votre base de données que PGAdmin conçue par DBA (je devrai mettre à jour les captures d'écran du didacticiel - PGAdmin 3 était OK, PGAdmin 4 est beaucoup trop lourd, et heureusement DBeaver est venu pour nous au bon moment).