如何将csv文件导入具有空值的Postgres?

时间:2018-07-11 13:25:24

标签: postgresql csv pgadmin

我正在尝试将一个包含年龄值的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, , , "

1 个答案:

答案 0 :(得分:3)

一个问题是您试图将空格导入数字字段。因此,首先必须对csv文件进行预处理,然后再导入。

以下是如何使用awk解决问题的示例。在控制台中执行以下命令:

$ cat file.csv | awk '{sub(/^ +/,""); gsub(/, /,",")}1' | psql db -c "COPY psychosocial.age FROM STDIN WITH CSV HEADER"

如果您想知道如何传递命令,请查看这些answers。这里是有关如何使用COPYSTDIN的更详细的example

您还必须考虑到整数字段上的引号可能会引起问题,例如:

"11455, , , "

这将导致错误,因为postgres会将"11455解析为单个值并将尝试将其存储在interger字段中,这显然会失败。相反,请格式化您的csv文件,如下所示:

11455, , , 

甚至

11455,,,

您也可以从控制台使用awk来实现此目的:

$ awk '{gsub(/\"/,"")};1' file.csv