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 行的主要内容,如果未能解决你的问题,请参考以下文章

在正则表达式中使用引号,在 C# 中使用引号

正则表达式将引号添加到不带引号的 CSV 列

正则表达式匹配双引号内的每个字符串并包含转义引号

无法使用正则表达式在双引号之间提取字符串

正则表达式在csv中找到缺少的双引号

jmeter接口测试--带有token的解决方法