![](/img/trans.png)
[英]PostgreSQL: COPY from csv missing values into a column with NOT NULL Constraint
[英]PostgreSQL copy from CSV with missing data values
我正在嘗試使用 COPY 將 CSV 文件導入 PostgreSQL。 當它碰到有空值的行時,它會窒息,例如下面的第二行:
JAN-01-2001,1,2,3,4,5
JAN-02-2001,6,7,,,
我已經嘗試過這個 COPY 語句,以及使用 NULL 和 QUOTE 的變體,但沒有找到任何有效的方法。
從'data.dat'使用分隔符','CSV復制數據;
有什么建議么? 數據文件是一個巨大的 22GB 平面文件,所以我想避免直接編輯它。
出於導入的目的,我建議將您的數字列轉換為文本列。 原因是空字符串不是有效的數值。 將數字列更改為文本列,導入 CSV 文件,將空值更新為 null 或 0,然后將列更改回整數。
你的說法很可疑:
COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;
DELIMITERS
在 7.3 之前的版本中使用。 為了不破壞舊代碼,它仍然受支持,但不再使用它。 正確的關鍵字是DELIMITER
。 而且您根本不需要指定,
因為它是FORMAT CSV
的默認值。
另外,我在這里引用手冊:
文件名
輸入或輸出文件的絕對路徑名。 Windows 用戶可能需要使用
E''
字符串並將路徑名中使用的任何反斜杠加倍。
大膽強調我的。 將'data.dat'
替換為 UNIX 上'/path/to/data.dat'
或 Windows 上的E'C:\\path\\to\\data.dat'
。
對於 7.3+ 版本,請使用:
COPY data FROM '/path/to/data.dat' CSV
對於 9.0+ 版本,請使用:
COPY data FROM '/path/to/data.dat' (FORMAT CSV)
如果您仍然收到此錯誤:
ERROR: invalid input syntax for type numeric: CONTEXT: COPY data, line 13, column interval_2400:
那么,很明顯,源文件與表data
的結構不匹配。 查看您的源文件,轉到第 13 行並查看列interval_2400
的值。 很有可能,它不是數字。 特別是,數字類型的列中不允許使用empty string
( ''
)。
您可以修復源文件或調整表定義:
ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;
或者更合適的類型。 從名稱來看,可能是interval
。 (但text
幾乎接受任何輸入值。)
或者,更好的是,創建一個修改過的臨時文件, COPY
到它,修復有問題的值,然后插入到目標表中,從文本轉換。 看:
這是 PostgreSQL 錯誤 - csv 解析器忽略最后一個空項並拋出錯誤 - “PG::BadCopyFileFormat: ERROR: missing data for column”。
我正在使用一個愚蠢的黑客:
如果最后一項為空,只需在字符串末尾添加一個分隔符:
1,2,3
1,2,,
這將添加錯過的最后一項以導入數據。
另一個警告 - 檢查錯誤的行號並確保它不是 CSV 文件中的空白行。 這將導致 postgres 拋出關於缺失值的相同錯誤。
你可以這樣做:
COPY productos FROM 'path/to/csv/productos.csv'
WITH DELIMITER ',' CSV HEADER FORCE NULL max_time, warn_time,
time_displayed, id_departamento ENCODING 'ISO 8859-1';
此參數FORCE NULL
(逗號分隔的字段列表)將空單元格轉換為空值到字段列表字段中。 請注意,我還必須指定文件編碼才能使其工作。
任何帶着較小文件來到這里的人:這是我發現的最簡單的解決方法,並且 csv 中的分隔符數量不一致。
這將遍歷整個 CSV 並強制它在分隔符 ( , ) 中具有正確的列數,即使該列中沒有數據也是如此。
如果你對 Excel 沒問題,你也可以把它變成一個宏,所以我的宏 (Ctrl + g) 可以一次性完成。 創建宏
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.