我有如下数据库输出:
$row = '(one,"pika chu",,"")'
如果我将此字符串作为参数发送到str_getcsv
,则会输出['one', 'pika chu', '', '']
。尽管缺席,第三个元素已变成空字符串。这非常烦人,因为我必须从空字符串中识别空值(无值)。我期望的输出是['one', 'pika chu', null, '']
。
我得到的输入来自PostgreSQL数据库,并表示为复合值。
例如,如果表格为pokemon_id => int4, name => text
,则查询将输出'(1, "pika chu")'
之类的字符串。通过示例对名称字段的唯一约束将允许存在以下两个记录:(100, '')
和(101, null)
。
获取时,它们被格式化为原始值,如:
'98,whatever'
'99,"pika chu"'
'100,""'
'101,'
'102,","'
我需要读取这些字符串,此示例必须输出以下数组:
['98', 'whatever']
['99', 'pika chu']
['100', '']
['101', null]
['102', ',']
有没有办法在PHP中做到这一点?
更新1: @deceze请发送给我this link,说明CSV中没有NULL(TL; DR,因为XML基本上没有空,这个问题has been tackled从那以后。)如何用NULL解析CSV呢?
更新2:我有使用preg_match_*
函数在PHP中创建专用解析器的建议。我有点不愿意这样做,因为1)性能影响与str_getcsv
相比2)事件preg_match
用于在传递的字符串超过8kb时发生段错误(这可能发生在CSV中上下文)。
更新3:我查看了str_getcsv
source code,看看是否有可能提出补丁来添加解析选项,就像在其他语言中一样。我现在更好地理解PHP的基础哲学。 @ daniel-vérité提出了实现状态机来解析CSV字符串的想法。尽管输入可以有数千行,重量为几十千字节,并且嵌入了CSV结构,但它可能是最佳方式。
感谢您的帮助。