【问题标题】:Postgresql - Regex split csv line with potentials quotesPostgresql - 带有潜在引号的正则表达式拆分 csv 行
【发布时间】: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 |屏幕

标签: postgresql csv postgresql-9.4


【解决方案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读取。
猜你喜欢
  • 2018-12-16
  • 2013-08-11
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多