我正在尝试使用
将大文件文本文件(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;
}
}
}
或类似的删除而不是跳过。
由于
答案 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 .....