如何在从csv / txt插入之前删除postgresql中的行

时间:2016-12-14 22:04:14

标签: 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;
        }
    }
}

或类似的删除而不是跳过。

由于

2 个答案:

答案 0 :(得分:0)

  

这是由于类似的事情; ; ;

他们来自哪里?应该有价值吗?如果它们用作符号“;”不是分隔符,你会得到损坏的数据。某些列可以出现在其他位置,依此类推。 您可以将文件重写为INSERT,然后逐行将其写入Postgres,但是获取混乱数据的可能性非常高。

答案 1 :(得分:0)

在这种情况下如何在加载到数据库之前预览数据?

使用工具处理CSV文件并将数据加载到其中。我个人更喜欢Pandas数据分析工作(当然它可以做更多的事情!),但它的方法.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文件的解释方式。如果你希望你可以删除一些行,填写缺席值等等。请看一下pandas文档 - 这个工具非常强大,可以修改数据。

如果您确定自己拥有正确的数据,可以使用.to_csv()方法或直接.to_sql()将其写回csv文件。

作为最后的手段,您可以迭代行,并使用它们执行一些操作。但我不推荐这种方式,特别是对于大桌子:

>>> 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 .....