我正在尝试将一个包含年龄值的csv文件导入Postgres,但是由于不是所有年龄,所以也有一些空值。 我想将这些列导入为真实列,因为这些列包含带有小数的年龄,例如98.45。年龄未知的人的空值显然被视为字符串,但是我仍然想将年龄值导入为数字。因此,我想知道如何导入真实值,即使csv中的某些单元为空,因此根据Postgres也将其视为字符串值。
为了进行创建,我使用了以下代码,因为我正在处理十进制值。
Create table psychosocial.age (
respnr integer Primary key,
fage real,
gage real,
hage real);
导入csv文件后,出现以下错误
ERROR: invalid input syntax for integer: "11455, , , "
CONTEXT: COPY age, line 2, column respnr: "11455, , , "
答案 0 :(得分:3)
一个问题是您试图将空格导入数字字段。因此,首先必须对csv文件进行预处理,然后再导入。
以下是如何使用awk
解决问题的示例。在控制台中执行以下命令:
$ cat file.csv | awk '{sub(/^ +/,""); gsub(/, /,",")}1' | psql db -c "COPY psychosocial.age FROM STDIN WITH CSV HEADER"
如果您想知道如何传递命令,请查看这些answers。这里是有关如何使用COPY
和STDIN
的更详细的example。
您还必须考虑到整数字段上的引号可能会引起问题,例如:
"11455, , , "
这将导致错误,因为postgres会将"11455
解析为单个值并将尝试将其存储在interger字段中,这显然会失败。相反,请格式化您的csv文件,如下所示:
11455, , ,
甚至
11455,,,
您也可以从控制台使用awk
来实现此目的:
$ awk '{gsub(/\"/,"")};1' file.csv