簡體   English   中英

來自 CSV 的 PostgreSQL 副本,缺少數據值

[英]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 中的分隔符數量不一致。

  1. 打開您的 CSV。
  2. Ctrl + Shift + 8(選擇所有數據)
  3. Ctrl + h(打開查找替換)
  4. 將查找框留空,以便查找長度為 0 的字符串。
  5. 在替換為框中輸入一個空格。

這將遍歷整個 CSV 並強制它在分隔符 ( , ) 中具有正確的列數,即使該列中沒有數據也是如此。

如果你對 Excel 沒問題,你也可以把它變成一個宏,所以我的宏 (Ctrl + g) 可以一次性完成。 創建宏

暫無
暫無

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

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