การแปลง xls เป็น csv ใน QGIS ด้วยคำจำกัดความของคอลัมน์ที่ถูกต้องและการส่งออกข้อมูลไปยัง postgis

Aug 18 2020

ฉันใช้ 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 ได้อย่างไร

คำตอบ

1 bugmenot123 Aug 18 2020 at 21:25

คุณต้องเพิ่มไฟล์ csvt เพื่อให้ QGIS สามารถอ่านประเภทข้อมูลที่ต้องการได้จากที่นั่น

ดูQGIS 3.2 - บังคับประเภทคอลัมน์เมื่อนำเข้า csv

อย่าใช้ CSV แต่เป็น XLS / XLSX แทนเพื่อที่คุณจะได้หลีกเลี่ยงสิ่งเหล่านั้นทั้งหมด

1 DPSSpatial Aug 18 2020 at 23:38

ฉันจะหลีกเลี่ยงการขึ้นอยู่กับ 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 มาหาเราในเวลาที่เหมาะสม)