Converter xls em csv no QGIS com definições de coluna corretas e exportar os dados para postgis

Aug 18 2020

Estou usando o QGIS 3.10.2 A Coruna. Depois de ler este tutorial (https://ieqgis.wordpress.com/2015/02/08/importing-csv-files-into-postgresql-using-the-db-manager-in-qgis/) Achei que tinha finalmente encontrado uma maneira simples de transformar xls-Data em csv e carregar esse csv-Data em Postgis. Todas as ações realizadas anteriormente em Carregar dados diretamente no pgAdmin foram muito desgastantes porque sempre havia problemas com a importação de dados com as definições de coluna corretas. Ao converter xls em csv via qgis, todas as colunas são convertidas em strings, o que está incorreto. Existe alguma ideia de como as planilhas do Excel podem ser transformadas em csv com definições de coluna corretas e importadas com esses formatos corretos para o Postgis?

Respostas

1 bugmenot123 Aug 18 2020 at 21:25

Você tem que adicionar um arquivo csvt para que o QGIS possa ler os tipos de dados pretendidos a partir daí.

Veja QGIS 3.2 - Forçando o tipo de coluna ao importar csv

Considere não usar CSV, mas sim XLS / XLSX para que você possa evitar tudo isso.

1 DPSSpatial Aug 18 2020 at 23:38

Eu evitaria depender do QGIS para carregar dados CSV, especialmente dada a quantidade de dados não espaciais que os CSVs provavelmente possuem, nos quais os tipos de dados podem ser lidos incorretamente.

Em vez disso, eu recomendo usar CSVKit não apenas para definir as colunas nas tabelas que resultarão de sua importação de CSV, mas então usar funções PostGIS para construir os dados espaciais, etc.

CSVKit pode ler um CSV e criar uma definição de coluna:

csvsql -i postgresql crime.csv

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

Melhor ainda, você realiza o acima e carrega o CSV em um comando:

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

Aqui está um tutorial que criei quando preciso fazer exatamente isso:

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

Eu também recomendo usar DBeaver em vez de PGAdmin para qualquer um desses trabalhos, pois é uma GUI muito mais amigável para o usuário / projetada por analistas para seu banco de dados do que o PGAdmin projetado por DBA (terei que atualizar as capturas de tela do tutorial - PGAdmin 3 era OK, PGAdmin 4 é muito pesado e, felizmente, o DBeaver apareceu para nós na hora certa).