postgresql - 如何将带有点作为千位分隔符的 CSV 文件导入 PostgreSQL
问题描述
我正在尝试将 CSV 文件读入 PostgreSQL。CSV 文件共有 20 列,当我在 PostgreSQL 中创建空表时,除了一列(称为“neto”)之外,我对每一列都有正确的数据类型。如果您尝试使用 Excel 打开 CSV 文件并检查“neto”列,您会看到它具有如下数字数据类型:“-1.234,10”,举个例子。
首先,我在 PostgreSQL 中创建一个空表:
CREATE TABLE invoices (
FECHA TIMESTAMP,
VENC TIMESTAMP,
COMPANIA VARCHAR(100),
FACTURA VARCHAR(100),
GRUPO VARCHAR(100),
CLIENTE VARCHAR(200),
VENDEDOR VARCHAR(100),
DESCRIP VARCHAR(300),
SEGMENTO VARCHAR(100),
MODELO VARCHAR(100),
ARTICULO VARCHAR(200),
CANTIDAD NUMERIC(100,50),
UNIDAD DOUBLE PRECISION,
ALMACEN DOUBLE PRECISION,
PRECIO MONEY,
IMPUESTO DOUBLE PRECISION,
DESCUENTO VARCHAR(200),
NETO MONEY,
ANULADA VARCHAR(200),
TASA DOUBLE PRECISION
);
然后,在尝试读取 CSV 后:
\copy invoices FROM 'C:/Users/Caproki/Desktop/INVOICES.CSV' DELIMITER ';' CSV HEADER;
我收到以下错误:
ERROR: invalid input syntax for type money: "5.796,00"
CONTEXT: COPY invoices, line 2, column neto: "5.796,00"
如您所见,由于我的本地设置,CSV 文件实际上是用分号而不是逗号分隔的,因为逗号用于分隔每个数字的整数部分和小数部分,而点则用作千位分隔符。
在进一步检查这个 CSV 文件后,似乎问题是因为这个点用作千位分隔符(例如,你有“1.200,00”而不是“1200,00”)。当我在 CSV 文件中更正此问题时,问题不再出现,我可以成功地将所有内容导入 PostregreSQL。
但是,我不愿意手动更改源 CSV 文件中列的数据类型,因为这是我每天都需要执行的导入过程。我想这样做是尽可能直接的,只是通过使用 SQL 导入 CSV 文件,我不是在寻找中间程序或解决这个简单问题的方法。
有没有办法在 PostgreSQL 中指定点用作千位分隔符?我在官方文档或其他 StackOverflow 问题中都找不到任何内容。
顺便说一句,我尝试将“neto”列的数据类型更改为数字、双精度和所有其他数字类型,但这并没有解决问题。
太感谢了。
解决方案
你不能独自做到这一点COPY
。它仅适用于类型输入函数可以理解的格式,这里不是这种情况。
要么在加载之前在 PostgreSQL 之外修改文件,要么将其加载到具有text
此位置的列的表中,然后修改表。
推荐阅读
- r - 如何在 r 中获得下个月的第一个工作日
- javascript - 完成两个 Promise 后执行函数
- multithreading - 如何从循环外取消处于侦听循环中的 TCPListener?
- php - 启用 XDebug 时 [] Operator not supported for strings 当操作数为空数组时有时会发生错误
- html - Angular 中的可折叠手风琴,无需使用 JS 代码,仅使用 HTML。每当我单击按钮时,它什么也不做。请解决这个
- android - Firebase getCurrentUser 在 linkWithCredentials 之后返回 null 有时
- java - 来自 java 对象的 JPA 查询
- azure - 在多个站点上设置 Azure 应用程序网关
- angular - tinymce angular 2+ 模板不会用 ngmodel 替换 init 上的值,而是使用用户插入的模板
- mysql - 即使我检查了语法错误,创建表也失败了