【发布时间】:2017-03-21 10:51:20
【问题描述】:
这里的目的是让this answer返回数组而不是setof数据类型。
CREATE FUNCTION split_csvline(
line text, -- the input CSV string
delim_char char(1) = ',', -- can be also E'\t', ';', '|', etc.
quote_char char(1) = '"' -- field quotation
) RETURNS text[] AS $f$
import csv
row = csv.reader(
[line],
quotechar=quote_char,
delimiter=delim_char,
skipinitialspace=True,
escapechar='\\'
)
next(row)
$f$ IMMUTABLE language PLpythonU;
SELECT split_csvline('a,b'); -- empty!
编辑
注意事项
这是一个关于“使用 Python 和 PostgreSQL”的问题。
我使用 PLpythonU 是因为工作人员使用 Python,而且 CSV 很复杂,需要可靠(多年测试)算法。
不需要解决方法,因为正在使用一个简单的解决方法:
CREATE FUNCTION split_csv_line(
text, char(1) DEFAULT ',', char(1) DEFAULT '"'
) RETURNS text[] AS $f$
SELECT x FROM split_csv($1,$2,$3) x LIMIT 1;
$f$ language SQL IMMUTABLE;
【问题讨论】:
-
为什么不使用
select regexp_split_to_array('a,b',',');? -
@BenH,CSV 很复杂,请参阅this regex,也许使用
regexp_matches()... -
我知道 csv 很复杂,但你应该考虑比
'a,b'更好的样本 -
您没有使用
return语句。恕我直言,几乎如果你想返回一些东西,所有的程序语言都要求这样做。
标签: python postgresql csv plpython