23

CSV 行示例:

"2012","Test User","ABC","First","71.0","","","0","0","3","3","0","0","","0","","","","","0.1","","4.0","0.1","4.2","80.8","847"

“First”之后的所有值都是数字列。很多 NULL 值就是这样引用的,对。

尝试复制:

copy mytable from 'myfile.csv' with csv header quote '"';

不:ERROR: invalid input syntax for type numeric: ""

嗯,是的。这是一个空值。在复制时尝试 2:

copy mytable from 'myfile.csv' with csv header quote '"' null '""';

不:ERROR: CSV quote character must not appear in the NULL specification

帅哥要做什么?在运行之前从文件中删除所有双引号COPY?可以做到这一点,但我认为对于必须是一个非常普遍的问题有一个适当的解决方案。

4

5 回答 5

13

虽然一些数据库产品将空字符串视为 NULL 值,但标准规定它们是不同的,而 PostgreSQL 将它们视为不同的。

如果您可以生成具有明确表示的 CSV 文件,那将是最好的。虽然您可以使用 sed 或其他工具将文件过滤为良好的格式,但另一个选项是将COPY数据放入表中,其中text列可以接受空字符串,然后填充目标表。该NULLIF函数可能对此有所帮助:http ://www.postgresql.org/docs/9.1/interactive/functions-conditional.html#FUNCTIONS-NULLIF - 如果两个参数匹配,它将返回 NULL,如果它们不匹配,则返回第一个值'吨。所以,类似的东西NULLIF(txtcol, '')::numeric可能对你有用。

于 2012-04-17T17:58:33.343 回答
7

作为替代方案,使用

sed 's/""//g' myfile.csv > myfile-formatted.csv
psql 
# copy mytable from 'myfile-formatted.csv' with csv header;

也可以。

于 2012-09-05T18:24:30.777 回答
5

我认为您在这里需要做的就是以下几点:

COPY mytable from '/dir/myfile.csv' DELIMITER ',' NULL '' WITH CSV HEADER QUOTE ;
于 2013-01-11T15:17:03.367 回答
3
COPY mytable from '/dir/myfile.csv' DELIMITER ',' NULL '' 
WITH CSV HEADER FORCE QUOTE *;
于 2017-09-22T17:47:26.653 回答
0

这在 Python 3.8.X 中对我有用

import psycopg2
import csv
from io import StringIO
db_conn = psycopg2.connect(host=t_host, port=t_port,
                           dbname=t_dbname, user=t_user, password=t_pw)
cur = db_conn.cursor()

csv.register_dialect('myDialect',
                     delimiter=',',
                     skipinitialspace=True,
                     quoting=csv.QUOTE_MINIMAL)

with open('files/emp.csv') as f:
    next(f) 
    reader = csv.reader(f, dialect='myDialect') 
    buffer = StringIO()
    writer = csv.writer(buffer, dialect='myDialect') 
    writer.writerows(reader) 
    buffer.seek(0)
    cur.copy_from(buffer, 'personnes', sep=',', columns=('nom', 'prenom', 'telephone', 'email'))
    db_conn.commit()
于 2020-05-23T14:14:05.990 回答