我的数据库是带有 en_US UTF-8 语言环境的 postgres v14 数据库。我必须导入许多 .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 已接受。
我在这篇文章中找到的 DECIMALCOMMASEPARATOR 在 psql 中导入文件时会产生错误。我也将 linux 语言环境设置为 en_DK 但没有成功。
我可以用点替换逗号,但我想保持数据不变。我无法想象 postgres 对此没有解决方案。有人可以帮我指出一些我忽略的信息吗?
提前谢谢您!
数字文字始终必须使用小数点,无论
lc_numeric
如何设置。此参数仅影响 D
:解释格式字母
to_numeric()
(以及其他)的方式
SELECT to_number('112,5', '990D99');
to_number
═══════════
112.5
(1 row)
您可以将其与
INSERT
一起使用,但无法与 COPY
一起使用。