簡體   English   中英

使用 COPY FROM 從 CSV 導入數據時的轉換列

[英]Casting column when using COPY FROM to import data from CSV

使用 PostgreSQL 12,我正在嘗試使用以下格式從 CSV 導入數據:

country,state,county,lat,lng,type,measure,beds,population,year,source,source_url
US,AK,ketchikan gateway,63.588753,-154.493062,ICU,1000HAB,3.928701,13745,2018,arcgis,https://services1.arcgis.com/Hp6G80Pky0om7QvQ/arcgis/rest/services/Hospitals_1/FeatureServer/0
US,AK,kodiak island,63.588753,-154.493062,ACUTE,1000HAB,,n,2018,arcgis,https://services1.arcgis.com/Hp6G80Pky0om7QvQ/arcgis/rest/services/Hospitals_1/FeatureServer/0

請注意,第二行的“人口”字段有一個n而不是空的。 我的目標是導入 CSV,使“人口”列為 BIGINT,“n”替換為 NULL。我目前的解決方案是:

CREATE TABLE temp_table
(
    country CHAR(2),
    state CHAR(2),
    county VARCHAR(255),
    lat DOUBLE PRECISION,
    lng DOUBLE PRECISION,
    type VARCHAR(11),
    measure VARCHAR(255),
    beds DOUBLE PRECISION,
    pop VARCHAR(255),
    year SMALLINT,
    source VARCHAR(255),
    source_url VARCHAR(255)
);

COPY temp_table 
FROM 'C:\\Users\\mconr\\Downloads\\global-hospital-beds-capacity-for-covid19\\hospital_beds_USA_v1.CSV' 
WITH (DELIMITER ',', FORMAT CSV, HEADER TRUE);

SELECT country, state, county, lat, lng, type, measure, beds, CAST (NULLIF (pop, 'n') AS BIGINT) AS population, year, source, source_url 
INTO USA
FROM temp_table;

DROP TABLE temp_table;

我目前的解決方案是創建一個臨時表,其中“人口”是 VARCHAR(255),導入數據,從 SELECT 語句創建一個新表,用 NULL 替換“n”並將列轉換為 BIGINT,然后刪除臨時表. 但是,這似乎有點低效,因為我正在創建和刪除一個中間表。 有誰知道這樣做的更好方法嗎?

您可以將 NULL 參數設置為“n”,但這會破壞其他情況,其中 null 字段以通常方式表示(由未加引號的空字符串),而不是“n”。 COPY 不允許您為每列設置 NULL。

你目前的方法對我來說似乎很好,這將是我的第一選擇(除了修復這個文件的生成器,它可能不受你的控制)。 您還可以使用 Perl 或 awk 或 sed 編寫一些內容,將文件編輯為 stream 以將 ',n,' 轉換為 ',,' 並使用 PROGRAM 功能將其連接到 COPY,但這看起來很繁瑣且錯誤容易,我懷疑效率的提高會那么大。

這被認為是那些過早的優化之一,它是最邪惡的根源。 這真的是一個有意義的問題嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM