Postgresql - 带有潜在引号的正则表达式拆分 csv 行
Posted
技术标签:
【中文标题】Postgresql - 带有潜在引号的正则表达式拆分 csv 行【英文标题】:Postgresql - Regex split csv line with potentials quotes 【发布时间】:2017-02-02 18:15:37 【问题描述】:我想在 postgres 中拆分代表 csv 行的列。此文本行中的字段由竖线分隔,有时它们用引号括起来,有时不是。此外,我们还可以转义字符。
field1|"field2"|field3|"22 \" lcd \| screen "
是否有正则表达式来拆分此列(即使用 regexp_split_to_array(....)?)
【问题讨论】:
string_to_array(.., '|')
应该可以正常工作
抱歉不明确,来自 field1|"field2"|field3|"22 \" lcd \|屏幕“我将获得 field1 field2 field3 22” lcd |屏幕
rextester.com/MXQPE34954
【参考方案1】:
与正则表达式无关,但它可以工作
create or replace function split_csv(
line text,
delim_char char(1) = ',',
quote_char char(1) = '"')
returns setof text[] immutable language plpythonu as $$
import csv
return csv.reader(line.splitlines(), quotechar=quote_char, delimiter=delim_char, skipinitialspace=True, escapechar='\\')
$$;
select *, x[4] from split_csv('field1|"field2"|field3|"22 \" lcd \| screen "'||E'\n'||'a|b', delim_char := '|') as x;
╔══════════════════════════════════════════════╤══ ══════════════════╗
║ x │ x ║
╠══════════════════════════════════════════════╪══ ══════════════════╣
║ field1,field2,field3,"22 \" 液晶屏 |屏幕“│22”液晶屏|画面║
║ a,b │ ░░░░ ║
╚══════════════════════════════════════════════╧══ ══════════════════╝
【讨论】:
嗨,什么样的额外设置需要这个解决方案?我应该只添加 python postgres 扩展还是需要安装特定的 csv 模块? @RobertoG。老实说,我不确定。它在这里“开箱即用”(Linux+PostgreSQL+Python)。试试吧。 @RobertoG。顺便说一句,我困了,对不起。功能简化,添加了更复杂的示例。祝你好运。 直接使用(从文件系统获取 CSV!)用open(line, 'rb')
替换 line.splitlines()
并使用文件名作为输入,例如。 /tmp/test.csv
。一般来说 pg-server 只能从/tmp
读取。以上是关于Postgresql - 带有潜在引号的正则表达式拆分 csv 行的主要内容,如果未能解决你的问题,请参考以下文章