올바른 열 정의를 사용하여 QGIS에서 xls를 csv로 변환하고 데이터를 postgis로 내보내기
QGIS 3.10.2 A Coruna를 사용하고 있습니다. 이 자습서를 읽은 후 (https://ieqgis.wordpress.com/2015/02/08/importing-csv-files-into-postgresql-using-the-db-manager-in-qgis/) 나는 마침내 csv에서 xls-Data를 변환하고이 csv-Data를 Postgis에로드하는 간단한 방법을 찾았다 고 생각했습니다. 데이터를 pgAdmin에 직접로드하기 전에 수행 한 모든 작업은 항상 올바른 열 결함으로 데이터를 가져 오는 데 문제가 있었기 때문에 매우 부담 스러웠습니다. qgis를 통해 xls를 csv로 변환 할 때 모든 열이 문자열로 변환되며 이는 올바르지 않습니다. Excel 시트를 올바른 열 정의로 csv로 변환하고 올바른 형식으로 Postgis로 가져올 수있는 방법에 대해 생각하십니까?
답변
QGIS가 거기에서 의도 한 데이터 유형을 읽을 수 있도록 csvt 파일을 추가해야합니다.
QGIS 3.2-csv를 가져올 때 강제 열 유형 참조
CSV 대신 XLS / XLSX를 사용하여 모든 것을 피할 수 있습니다.
특히 CSV 데이터가 잘못 읽을 수있는 비 공간 데이터의 양을 고려할 때 QGIS에 의존하여 CSV 데이터를로드하는 것을 피할 것입니다.
대신 CSVKit을 사용하여 CSV 가져 오기의 결과로 테이블에 열을 정의 할뿐만 아니라 PostGIS 함수를 사용하여 공간 데이터 등을 구축하는 것이 좋습니다.
CSVKit은 CSV를 읽고 열 정의를 만들 수 있습니다.
csvsql -i postgresql crime.csv
결과는 다음과 같습니다.
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
);
그러나 더 나은, 당신은 위의 작업을 수행 하고 하나의 명령에 CSV를로드 :
csvsql --db postgresql://username:password@servername/databasename --table denver_crime --insert crime.csv
이 작업을 수행해야 할 때 만든 자습서는 다음과 같습니다.
https://github.com/dpsspatial/Installation-Instructions/blob/master/csvkit.md
DBA가 디자인 한 PGAdmin보다 훨씬 더 사용자 친화적이고 분석가가 디자인 한 GUI이므로이 작업에 PGAdmin 대신 DBeaver를 사용하는 것이 좋습니다 (튜토리얼 스크린 샷을 업데이트해야합니다-PGAdmin 3 좋아, PGAdmin 4는 너무 무겁고 운 좋게도 DBeaver가 적절한시기에 우리를 위해 왔습니다).