Postgresql-带引号的正则表达式拆分csv行

Postgresql-带引号的正则表达式拆分csv行,postgresql,csv,postgresql-9.4,Postgresql,Csv,Postgresql 9.4,我想拆分一列,该列表示postgres中的csv行。此文本行中的字段由管道分隔,有时用引号括起来,有时不用引号括起来。此外,我们还可以逃过一劫 field1|"field2"|field3|"22 \" lcd \| screen " 是否有用于拆分此列的正则表达式(即使用regexp_split_to_array(..))与regexp无关,但它可以工作 create or replace function split_csv( line text, delim_char char(

我想拆分一列,该列表示postgres中的csv行。此文本行中的字段由管道分隔,有时用引号括起来,有时不用引号括起来。此外,我们还可以逃过一劫

field1|"field2"|field3|"22 \" lcd \| screen "

是否有用于拆分此列的正则表达式(即使用regexp_split_to_array(..))

与regexp无关,但它可以工作

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\”lcd屏幕}│ 22英寸液晶显示屏║ ║ {a,b}│ ░░░░ ║ ╚══════════════════════════════════════════════╧════════════════════╝
string_to_array(…,“|”)
应该可以很好地工作。很抱歉没有明确说明,从field1“field2”field3“22”lcd\| screen“我将获得field1 field2 field3 22”lcd | screenHi,什么样的附加设置需要这种解决方案?我应该只添加python postgres扩展还是需要安装特定的csv模块?@RobertoG。老实说,我不确定。它在这里“开箱即用”(Linux+PostgreSQL+Python)。“试试看!”罗伯托说。顺便说一句,我很困,对不起。功能简化,添加了更复杂的示例。祝你好运。要直接使用(从文件系统获取CSV!),请将
line.splitlines()
替换为
open(line,'rb')
,并使用文件名作为输入,例如
/tmp/test.CSV
。一般来说,pg服务器只能从
/tmp
读取。 ╔══════════════════════════════════════════════╤════════════════════╗ ║ x │ x ║ ╠══════════════════════════════════════════════╪════════════════════╣ ║ {field1,field2,field3,"22 \" lcd | screen "} │ 22 " lcd | screen ║ ║ {a,b} │ ░░░░ ║ ╚══════════════════════════════════════════════╧════════════════════╝