การแปลง xls เป็น csv ใน QGIS ด้วยคำจำกัดความของคอลัมน์ที่ถูกต้องและการส่งออกข้อมูลไปยัง 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/) ฉันคิดว่าในที่สุดฉันก็พบวิธีง่ายๆในการแปลง xls-Data ใน csv แล้วโหลด csv-Data นี้ลงใน Postgis การดำเนินการทั้งหมดที่เกิดขึ้นก่อนหน้านี้ในการโหลดข้อมูลลงใน pgAdmin ทำให้เกิดปัญหาอย่างมากเนื่องจากมักจะมีปัญหาในการนำเข้าข้อมูลด้วยการกำหนดคอลัมน์ที่ถูกต้อง เมื่อแปลง xls เป็น csv ผ่าน qgis คอลัมน์ทั้งหมดจะถูกแปลงเป็นสตริงซึ่งไม่ถูกต้อง มีความคิดบ้างไหมว่าแผ่นงาน excel สามารถเปลี่ยนเป็น csv ด้วยคำจำกัดความคอลัมน์ที่ถูกต้องและนำเข้าด้วยรูปแบบที่ถูกต้องเหล่านี้ไปยัง Postgis ได้อย่างไร
คำตอบ
คุณต้องเพิ่มไฟล์ csvt เพื่อให้ QGIS สามารถอ่านประเภทข้อมูลที่ต้องการได้จากที่นั่น
ดูQGIS 3.2 - บังคับประเภทคอลัมน์เมื่อนำเข้า csv
อย่าใช้ CSV แต่เป็น XLS / XLSX แทนเพื่อที่คุณจะได้หลีกเลี่ยงสิ่งเหล่านั้นทั้งหมด
ฉันจะหลีกเลี่ยงการขึ้นอยู่กับ QGIS ในการโหลดข้อมูล CSV โดยเฉพาะอย่างยิ่งเมื่อพิจารณาจากจำนวนข้อมูลที่ไม่ใช่เชิงพื้นที่ซึ่ง 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
ฉันขอแนะนำให้ใช้ DBeaver แทน PGAdmin สำหรับงานนี้เนื่องจากเป็น GUI ที่ใช้งานง่าย / ออกแบบโดยนักวิเคราะห์ไปยังฐานข้อมูลของคุณมากกว่า PGAdmin ที่ออกแบบโดย DBA (ฉันจะต้องอัปเดตภาพหน้าจอบทช่วยสอน - PGAdmin 3 คือ ตกลง PGAdmin 4 หนักเกินไปและโชคดีที่ DBeaver มาหาเราในเวลาที่เหมาะสม)