Postgresql

將 csv 文件複製到 PostgreSQL 表中時解析 DATE

  • April 30, 2021

我有一長串.csv文件,我想將它們導入本地數據庫。DATE我相信我的查詢是正確的,但是在解析和TIMESTAMP列方面存在一些問題。PostgreSQL 讀取這些列時需要 ISO 格式“yyyy/mm/dd”,但我的數據有另一種格式:“dd/mm/yyyy”。

我在網上和其他 Stack Overflow 上閱讀SETdatestyle可以有所不同的答案,但不建議這樣做。

有沒有辦法指定要導入的列的格式?另外,我不需要從 csv 文件中導入所有列:我可以省略一些嗎?

細節

首先,我編寫了創建表的程式碼(如果列名是意大利語,很抱歉,但這並不重要):

CREATE TABLE IF NOT EXISTS bikes (
   bici INT,
   tipo_bici VARCHAR(20),
   cliente_anonimizzato INT,
   data_riferimento_prelievo DATE,
   data_prelievo TIMESTAMP,
   numero_stazione_prelievo INT,
   nome_stazione_prelievo TEXT,
   slot_prelievo SMALLINT,
   data_riferimento_restituzione DATE,
   data_restituzione TIMESTAMP,
   numero_stazione_restituzione INT,
   nome_stazione_restituzione TEXT,
   slot_restituzione SMALLINT,
   durata VARCHAR(10),
   distanza_totale REAL,
   co2_evitata REAL,
   calorie_consumate REAL,
   penalità CHAR(2)
);

然後我添加查詢以將數據複製到表中:

COPY bikes(
   bici,
   tipo_bici,
   cliente_anonimizzato,
   data_riferimento_prelievo,
   data_prelievo,
   numero_stazione_prelievo,
   nome_stazione_prelievo,
   slot_prelievo,
   data_riferimento_restituzione,
   data_restituzione,
   numero_stazione_restituzione,
   nome_stazione_restituzione,
   slot_restituzione,
   durata,
   distanza_totale,
   co2_evitata,
   calorie_consumate,
   penalità
)
FROM '/Users/luca/tesi/data/2019q3.csv'
DELIMITER ','
CSV HEADER;

程式碼看起來不錯,除了彈出以下錯誤:

ERROR:  date/time field value out of range: "31/07/2019"
HINT:  Perhaps you need a different "datestyle" setting.
CONTEXT:  COPY bikes, line 25296, column data_riferimento_restituzione: "31/07/2019"
SQL state: 22008

如何CREATE TABLE在程式碼部分中指定要解析的格式?另外,我實際上並不需要這個 csv 的所有 cols,我該如何將它們排除在外?我試圖只指定我需要的那些,但我得到一個導入錯誤:

ERROR:  extra data after last expected column

設置datestyleISO, DMY,您的日期將根據需要進行解析。設置該參數沒有任何問題 - 請SET在您之前進行COPY

無法跳過 CSV 文件中的列。向表中添加額外的列並稍後刪除它們,這很便宜。

引用自:https://dba.stackexchange.com/questions/290762