我的数据库是一个带EN_US UTF-8语言环境的Postgresv14数据库.我必须导入许多.csv文件,它们通常有一个小数点(3.14)表示实数,有时还有一个小数逗号(3,14).我的问题是:有没有一种方法可以设置postgres,使数据被正确地读入postgres?

我做了什么:我知道数据是否有小数点或逗号.在Pandas 身上,通过设置地点,这个解决方案相当优雅,比如:

# test for decimal point, set locale accordingly
decimaal_teken = meta_data.iloc[0].loc['bronbestand_decimaal']
if decimaal_teken == '.':
    logger.warning(f'Floating point met decimale punt')
    locale.setlocale(locale.LC_NUMERIC, 'en_EN.utf8')

elif decimaal_teken == ',':
    logger.warning(f'Floating point met decimale komma')
    locale.setlocale(locale.LC_NUMERIC, 'en_DK.utf8')

else:
    logger.warning(f'Onbekend decimaal teken: "{decimaal_teken}", decimale punt wordt gebruikt')
    locale.setlocale(locale.LC_NUMERIC, 'en_EN.utf8')

我在Postgres寻找类似的解决方案,但我找不到.我有一个测试文件,如下所示:

SET lc_numeric = 'en_DK';
-- SET DECIMALSEPARATORCOMMA=ON;

INSERT INTO public.floats (naam, value)
VALUES
('Drente', '112,5');

我通过-f或\i将文件导入到psql中.在这两种情况下,都存在112,5不是有效实数的错误.112.5是可以接受的.

我在this article中找到的DECIMALCOMMASEPARATOR在将文件导入到psql中时产生错误.我也将Linux语言环境设置为en_dk,但没有成功.

我可以用点替换逗号,但我想保持数据不变.我无法想象Postgres对此没有解决方案.有人能帮我指出一些我忽略的信息吗?

提前谢谢您!

推荐答案

无论如何设置lc_numeric,数字文字都必须使用小数点.此参数仅影响to_numeric()解释格式字母D(以及其他内容)的方式:

SELECT to_number('112,5', '990D99');

 to_number 
═══════════
     112.5
(1 row)

你可以把它用在INSERT上,但不能用在COPY上.

Postgresql相关问答推荐

创建发布性能

Postgres 将分区附加到表的时间太长.想明白为什么

如何判断上次在 TimescaleDB 上运行连续聚合作业(job)的时间

函数将多列作为单列而不是多列返回

Docker - 判断 postgres 是否准备好

如何从元组列表中 Select 与多列匹配的行?

从左连接更新 Postgres

INSERT RETURNING 是否保证以 right的顺序返回?

Rails 3:在 Postgres 支持的 ActiveRecord 中使用 json 作为列类型时出现迁移错误

如何使 Java 和 Postgres 枚举一起工作以进行更新?

Mac psql/readline - 未加载库

mysql_insert_id 替代 postgresql

如何创建 postgres 数据库模式的 sql 脚本?

Postgresql 中的 NOT EXISTS 子句

Postgis / Geodjango:无法确定数据库的 PostGIS 版本

如何将 Heroku PG 转储导入本地机器

没有函数匹配给定的名称和参数类型

PostgreSQL 多种认证方式

在 Postgres 9.0+ 中使用 PL/pgSQL 在表上循环

PostgreSQL - GROUP BY 子句或用于聚合函数