2016-12-14 112 views
1

我試圖在windows 10中使用如何從csv/txt插入之前在postgresql中刪除一行

將大文件文本文件(100k行,x列,分隔符是';')導入到postgresql 9.6,pgadmin4中
COPY my_table FROM 'E:\DATA\my_file.txt' (DELIMITER(';'); 

文本文件中的少量行具有多於x列;結果我得到了「錯誤:最後一次預期的列之後的額外數據」消息。這是由於類似的東西; ; ;

我正在尋找一種方法來檢測這些行,並刪除它們像一個觸發器,而不是插入。

感謝您的快速回答,但有沒有辦法用postgresql清理數據? 我想到的是這樣(僞):

CREATE my_table(x columns); 
CREATE funtion import_csv(csv_file,my_table){ 
    for i = 1 to count_rows(csv_file){ 
     if count_columns.csv_file.row(i)<>x{ 
      Skip csv_file.row(i); 
     }else{ 
      insert csv_file.row(i) in my_table; 
     } 
    } 
} 

或刪除而不是跳過類似的東西。

感謝

+3

想到在將數據複製到數據庫之前,您可能需要使用Python或其他方法「清理」數據文件。 – danjuggler

回答

0

如何在這種情況下加載到數據庫之前預覽數據?

拿一個工具來處理CSV文件並將數據加載到該文件中。我個人更喜歡Pandas數據分析labrary(當然它可以做很多,很多!),但它的方法.read_csv()實現得非常好:

$ cat err.csv 
0.0;0.7;0.29 
1.0;0.23;0.55 
0.0;0.72;0.42;-1;-3.4 
0.0;;0.98;0.68 
0.0;0.48;0.39;0;8 
1.0;0.34;0.73 
0.0;0.44;0.06 
1.0;0.4;0.74 
0.0;0.18;0.18 
1.0;0.53;0.53 

$ python 
>>> import pandas as pd 
>>> df=pd.read_csv('err.csv', header=None, sep=';', names='ABCDEFGH') 
>>> df 
    A  B  C  D E F G H 
0 0.0 0.70 0.29 NaN NaN NaN NaN NaN 
1 1.0 0.23 0.55 NaN NaN NaN NaN NaN 
2 0.0 0.72 0.42 -1.00 -3.4 NaN NaN NaN 
3 0.0 NaN 0.98 0.68 NaN NaN NaN NaN 
4 0.0 0.48 0.39 0.00 8.0 NaN NaN NaN 
5 1.0 0.34 0.73 NaN NaN NaN NaN NaN 
6 0.0 0.44 0.06 NaN NaN NaN NaN NaN 
7 1.0 0.40 0.74 NaN NaN NaN NaN NaN 
8 0.0 0.18 0.18 NaN NaN NaN NaN NaN 
9 1.0 0.53 0.53 NaN NaN NaN NaN NaN 

NaN不存在價值。在這裏你可以看看你的CSV文件是如何解釋的。如果你希望你可以刪除一些行,填寫缺席值等。請看一下熊貓文檔 - 這個工具對於修補數據非常有用。

如果您確定自己擁有正確的數據,則可以用.to_csv()方法或直接將其寫回csv文件.to_sql()

作爲最後的手段,您可以遍歷行並對它們執行一些操作。但我不推薦這種方式,特別是對於大型表格:

>>> for row in df.iterrows(): 
...  print(row) 
... 
... 
(0, A 0.00 
B 0.70 
C 0.29 
D  NaN 
E  NaN 
F  NaN 
G  NaN 
H  NaN 
Name: 0, dtype: float64) 
(1, A 1.00 
B 0.23 
C 0.55 
D  NaN 
E  NaN 
F  NaN 
G  NaN 
H  NaN 
Name: 1, dtype: float64) 
# ...... and so on ..... 
+0

該文件確實看起來很像你的爲例: 0.0; 0.7;約翰; 0.29 1.0; 0.23;麥克; 0.55 0.0; 0.72 ;; ;;簡 - 3.4 0.0; 0.98;吉爾; 0.68 0。0; 0.48 ;;; 0 1.0; 0.34;卡爾; 0.73 0.0; 0.44;詹姆斯; 0.06 1.0; 0.4;基基; 0.74 0.0; 0.18;阿爾伯特; 0.18 1.0; 0.53;馬克; 0.53 我不希望預覽文件太大(超過10萬行),但如果可以使用Pandas識別本示例中的第三行和第五行(超過4行),刪除/移動它們會很棒然後用.to_csv()將數據寫回csv。 感謝您的提示。我會考慮它。 –

+0

看看選項'warn_bad_lines' - 它會忽略壞行並警告你/ –

+0

謝謝,我會的。 –

0

This is due to things like ; ; ;

他們從哪兒來?應該有價值嗎?如果它們被用作符號「;」不是分隔符,你會得到損壞的數據。某些列可能會出現在其他地方等。 你可以重寫你的文件到INSERT中,並將它逐行地輸入到Postgres中,但是獲得混亂數據的機會非常高。

+0

它們通常用作分隔符,但有時用作符號。這些行確實有列出現在錯誤的地方。 由於損壞的行數量少於10每100k,我寧願刪除它們或將它們作爲字符串放在錯誤表中。 你可能有一個示例代碼:「你可以將你的文件改寫爲INSERT,並將它逐行地送入Postgres」? –

+0

最佳解決方案 - 使用轉義重新導出此CSV;「符號?可能你有源數據或者同樣重新出口? –

相關問題