【问题标题】:postgres comma in column name, import issue列名中的postgres逗号,导入问题
【发布时间】:2016-09-08 11:07:34
【问题描述】:

我有一些需要在表格中更新的数据。我正在使用 pgadmin3 导入工具 csv GUI。 我的问题是如何设置导入设置。

数据结构非常糟糕,列名如"width, inside" integer,我对此无能为力。

我可以忽略列名引号内的逗号 (,) 吗?

我得到的错误是

"ERROR: invalid input syntax for integer: ""
CONTEXT: COPY mytable, line 2, column width integer, inside: ""

所以它以我尽量避免的方式解释引号内的逗号。

额外: 我将 '\N' 放在 NULL 选项中,因为 csv 文件中的许多记录都是空的,例如 ""、""、""、...

CSV 文件和表结构片段

create table a (
  "Width, inside" integer,
  "Area" character varying(50),
  "Year" date
)

"width, inside", "Area", "Year"
"3","sub",""

【问题讨论】:

  • 对列名使用双引号
  • 发布 csv 文件的第一行。
  • 您的问题不是列名,看来它已经被很好地引用了。您的其中一行包含该列的空值 "",它不是有效的整数。 (注意:\Ntext 格式中的默认 NULL 值,但是在 CSV 格式中,未加引号的空字符串将默认变为 NULL;您可以使用 NULL 选项更改行为COPY command)。
  • 是的,你是对的,就是这样。但是,我不清楚如何将 emtyp 空整数设置为默认值而不是空文本值“”。结果比我希望的要复杂。
  • 请提供您尝试执行的 COPY 语句以及 CSV 中的一些示例行(以及标题)。如果您使用CSV 格式进行复制,您应该尝试使用类似,,,"data",,234,,,, 的行(注意逗号之后:每个相邻的逗号之间会有一个SQL NULL)。

标签: postgresql csv import


【解决方案1】:
create table a ("column, comma" int);
select "column, comma" from a;

这不会引发异常。

明确地将带有正字法的 cmets 放在列名中是一种不好的做法。我会将其重命名为合理的名称。

【讨论】:

  • 感谢您的回复。表结构已采用您建议的格式。但它仍然无法将 csv 导入到该表。对我来说,导入解释器似乎在列名中找到了我的 (,) 并将其中断,并且没有将其视为完整列名的一部分,尽管有引号。
  • 所以将你的 csv 中的所有 width, inside 替换为 "width, inside"
【解决方案2】:

一种方法是将分隔符从 更改为 ; .您可以在 text/csv 文件中手动进行替换,并在导入屏幕中指定;作为分隔符(我猜你的客户应该有它 - 查看一个名为 misc 选项的选项卡或类似的东西)

postgres 中的 ,​​ 在字符串中间可能还有其他问题 - 这可以通过用 $$ 替换双引号来解决

因此这可能有效:

    $$width, inside$$; $$Area$$; $$Year$$

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多