簡體   English   中英

Postgres導入雙引號值

[英]Postgres import a double quote value

我有一個900萬行的.csv大文件。 其中一些列包含帶引號或其他特殊字符的文本,我想從此.csv文件導入數據庫。 例如,我想導入此行:

ID   BH   Units       Name                         Type_building      Year_cons
1    4    900.00      schoolgebouw "De Bolster     Schoolgebouw       2014-01-01

如您所見,第四欄中有一個雙引號。 .csv文件中的值均未加引號,但有時文本中會出現雙引號或反斜杠“ \\”。 當我嘗試使用以下方式上傳數據時:

\COPY <tablename> FROM <path to file> WITH CSV DELIMITER ';' NULL '\N';

它給出一條錯誤消息:ERROR值長為類型字符varianting(25)。 顯然,它將雙引號視為字符串的開頭,並嘗試將.csv文件中的所有內容(包括第五和第六列)組合到一個單元格中(因此該單元格將包含“ De Bolster Schoolgebouw 2014-01” -01”),因為“名稱”列最多允許25個字符,因此不合適。

我發現了一個類似的主題( 可以用CSV格式在Postgres COPY命令中關閉報價處理嗎? ),在該主題中提出了以下解決方案:

\COPY <tablename> FROM <path to file> WITH CSV DELIMITER ';' QUOTE E'\b' NULL '\N';

我認為它的作用是將引號值(默認為雙引號)設置為其他值,在這種情況下為退格鍵,因此它將不再將雙引號識別為引號。 但是,當我運行此命令時,我得到另一個錯誤:整數的無效輸入語法。

發生的事情是,現在每個值都用引號引起來,因此具有值“ 1”的ID變為值““ 1””,並且由於ID被定義為整數,因此它不接受引號。

您是否知道如何將.csv文件中的雙引號和其他特殊字符導入postgres數據庫?

提前致謝!!

根據錯誤消息,我懷疑它與雙引號或任何形式的東西有關—如果是這樣的話,那將是廣為報道的錯誤,並且已經修復了很長時間。

對於Postgres,錯誤消息幾乎總是正確且有用。 因此,請考慮一個非常現實的可能性,那就是字符多於視線。

我自己的猜測是,您在某處有一些尾隨(或前導)空格,因此,在電子表格中查看時,數據片段看起來長24個字符,而實際上更長。

如果您不這樣做,我的第二個猜測將是某種古怪的字符集沖突或影響。 也許您有一些雙字節字符,或者由於其中存在變音符號而使兩個單個字符表現為單個字符。 在您用於數據的查看器中,這些看起來不錯。 但是,當這些字符被解釋或視為utf8時,它們最終將計數為兩個不同的字符。 imo不太可能,但可能( 示例 )。

最后,按照弗蘭克的建議,嘗試刪除長度限制。 它只會使您放慢腳步,因為它會減慢插入速度並阻止您前進。 導入完成后,將約束重新添加到表的定義中。 然后,您可以使用以下方法找到有問題的行:

select name from table where length(name) > 24;

...並且在修復它們后,如果有任何目的,您將可以重新添加約束。 (提示:沒有,或者至少應該沒有。)有一個真實的人,名字叫:“金鍾(Kim-Jong)性感光彩的野獸神父迪克(Dick)父親可愛的鋼鐵俠,甚至是獨特的Poh Un Winn Charlie Ghora Khaos Mehan Hansa Kimmy Humbero Uno Master Over Dance Shake Bouti Bepop Rocksteady Shredder Kung Ulf Road House Gilgamesh Flap Guy Theo Ass Hole Im Yoda Funky Boy Slam Duck Chuck Jorma Jukka Pekka Ryan Super Air Ooy Rusell Salvador Alfons Molgan Akta Papa Long Nameh Ek。“)

暫無
暫無

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

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