【问题标题】:PSQL import from CSV adding additional characters从 CSV 导入 PSQL 添加其他字符
【发布时间】:2018-02-21 05:32:30
【问题描述】:

我有一个 CSV 文件,我要在其中导入多个字段...其中一个字段是日期类型字段,格式为“20120401”。在 CSV 文件中,所有行的此字段的长度为 8。我在 Postgres 中创建了一个表,并指定了接收此数据的字段作为 DATE 类型列。当我导入 CSV 文件时,它引发了“无效输入错误”。为了解决这个问题,我将表的类型更改为 VARCHAR,认为以后可以运行 ALTER TABLE 来更改数据类型。导入成功,但 ALTER TABLE 不成功。我注意到第一行的日期长度为 9,而其余所有行的标准长度为 8。不知何故,在导入过程中,它获得了另一个角色,对于我的生活,我无法确定它来自哪里。我已经完成了一堆 TRIM 操作(TRIM、BTRIM),但仍然产生 9 个字符。有什么建议么?如果我删除这一行,将其更改为 DATE 类型的 ALTER TABLE 语句将起作用。所以真的只有这一行。

示例如下:

20150401    My  Gll ES  1A3AE039E352    GCE 0.2461158

20150401    My  Gll ES  1F63E45849F1    GCE 0.8670354

【问题讨论】:

  • 您能否将 CSV 文件中的前 2 或 3 行直接包含在您的问题中,格式为代码(每行有四个缩进空格)?可能源文件中有一些特殊字符。
  • 我实际上尝试以 CSV 格式重新保存文件,这似乎有效。 Mac 上的原始文件是“CSV UTF-8(逗号分隔)(.csv)”。我重新保存为“逗号分隔值 (.csv)”,这似乎保存了一个稍微缩小的文件,并且还删除了导入问题。

标签: postgresql csv psql


【解决方案1】:

凝视我的水晶球,我发现它是文件开头的byte order mark (BOM)。

那将是 UNICODE 字符 U+FEFF,在 UTF-8 中它将是 EF BB BF。

虽然字节顺序标记在 UTF16 编码中用于确定 endianness,但它们在 UTF-8 中无用,但一些操作系统将它们用作表示“此文件是 UTF-8 的标记” ”。

您必须删除该角色。

【讨论】:

  • 你说得对。当我查询导入后的前几行时,我看到了 。这会因 DATE 类型的字段而失败,但适用于 VARCHAR。我不太清楚如何确切地删除它。这只是带有 TRIM 功能的更新吗?
  • 您可以使用substr(charfield, 2)。但我认为你应该在导入之前清理 CSV 文件。
  • 太棒了。谢谢。
猜你喜欢
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2019-12-30
  • 2017-01-07
相关资源
最近更新 更多