2011-12-01 17 views
16

我想使用COPY將CSV文件導入到PostgreSQL中。當它碰到一排有空值的行時會窒息,例如下面第二行:PostgreSQL從CSV中複製數據缺失值

JAN-01-2001,1,2,3,4,5

JAN-02-2001,6,7,,,

我試過這個COPY語句,以及使用NULL和QUOTE的變體,並沒有發現任何工作。

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

有什麼建議嗎?數據文件位於一個巨大的22GB平面文件中,因此我想避免直接編輯它。

+2

而錯誤是? –

+1

這不是完整的故事。據[文檔](http://www.postgresql.org/docs/8.3/static/sql-copy.html)和我上面的檢查案例適用於任何現代PostgreSQL(在CSV模式下沒有引號的空值)。也許你有沒有NULL修飾符或無效數字的逗號? –

+0

錯誤:類型數字的輸入語法無效: 上下文:COPY數據,第13行,列interval_2400: – ugh

回答

2

爲了導入目的,我建議將您的數字列轉換爲文本列。原因是空字符串不是有效的數字值。將您的數字列更改爲文本列,導入CSV文件,將空值更新爲空值或0,然後將列更改回整數。

+0

在CSV格式中,分隔符之間沒有任何內容表示NULL,而不是空字符串,這是數字值的有效語法。空字符串被寫爲空雙引號:'「」'。 –

+0

如果像我這樣的人被Erwin關於空字符串的有用評論所困惑,表示CSV文件中空白 - 我正在使用文本(TSV)文件......它是空白值的另一個符號:'\ N'。 – Sigfried

2

有了這樣,你應該始終包括有關操作系統和PostgreSQL的版本號信息的問題。

你的說法很可疑:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV; 

DELIMITERS版本中使用7.3之前。爲了不破壞舊代碼,仍然支持它,但不再使用它。正確的關鍵字是DELIMITER。而且您根本不需要指定,,因爲它是FORMAT CSV的默認值。
另外,我引用manual here

filename

The absolute path name of the input or output file. Windows users might need to use an E'' string and double any backslashes used in the path name.

所以,你'data.dat'應該像'/path/to/data.dat'在UNIX或E'C:\\path\\to\\data.dat'在Windows上。

對於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有什麼值。機會是,它不是數字。您可以修復的源文件適應表定義

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text; 

或什麼都類型是比較合適的。從名字判斷可能是interval

+0

PostgreSQL 9.1.1,MacOSX 10.7.2。正如我上面提到的,導入文件的前12行很好。這些列實際上是數字並且與表定義匹配。這只是一些行缺少值。 – ugh

+0

@ user1076175:請用您的數據文件的前15行編輯您的問題。還把版本信息放在你的問題中(不是在我的答案的評論中)。 –

+0

主要問題是腐敗csv當然。現在我有一個50GB的大csv,每1000條線上有一條線路丟失。所以問題是我們可以告訴postgresql只是爲了解決拋出錯誤的問題並繼續其餘的工作。 – Smalcat

-1

任何人都來這裏與較小的文件:這是我發現這個最簡單的修復和csv中的分隔符數量不一致。

  1. 打開您的CSV。
  2. CTRL + SHIFT + 8(選擇所有數據)
  3. Ctrl + H鍵(打開找到替換)
  4. 保留查找框爲空,以便其尋找0長度的字符串。
  5. 在替換方框中輸入一個空格。

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

如果你還可以使用Excel,你也可以把它變成一個宏,所以我的宏(Ctrl + g)一次就做到了這一點。 Creating a Macro

0

這是PostgreSQL的錯誤 - CSV解析器忽略最後的空項目,並拋出錯誤 - 「PG :: BadCopyFileFormat:錯誤:缺少列數據」。

我是用一個愚蠢的黑客:行

1,2,3 
1,2,, 

這個插件錯過了最後一個項目導入數據:

如果最後一個項目是空的,簡單的添加一個分隔符結束的字符串。

0

另外一個警告 - 檢查錯誤的行號並確保它不是CSV文件中的空白行。這會導致postgres拋出關於缺失值的相同錯誤。