Php 在CSV输入中将空字符串与空字符串区分开来

Php 在CSV输入中将空字符串与空字符串区分开来,php,csv,null,Php,Csv,Null,我有如下数据库输出: $row='(一个“皮卡猪”、“)” 如果我把这个字符串作为参数发送给它,它将输出['one','pika chu','''',',]。第三个元素(尽管不存在)已变成空字符串。这很烦人,因为我必须从空字符串中识别空值(无值)。我期望的输出是['one','pika-chu',null',] 我得到的输入来自PostgreSQL数据库,并表示为复合值 例如,如果一个表是pokemon\u id=>int4,name=>text,那么查询将输出字符串,如”(1,“pika ch

我有如下数据库输出:

$row='(一个“皮卡猪”、“)”

如果我把这个字符串作为参数发送给它,它将输出
['one','pika chu','''',',]
。第三个元素(尽管不存在)已变成空字符串。这很烦人,因为我必须从空字符串中识别空值(无值)。我期望的输出是
['one','pika-chu',null',]

我得到的输入来自PostgreSQL数据库,并表示为复合值

例如,如果一个表是
pokemon\u id=>int4,name=>text
,那么查询将输出字符串,如
”(1,“pika chu”)”
。通过示例对名称字段的唯一约束将允许存在以下两个记录:
(100),
(101,null)

获取时,它们被格式化为原始值,如:

“98,随便”
‘99年,皮卡丘’
'100,""'
'101,'
'102,","'

我需要读取这些字符串,此示例必须输出以下数组:

['98','随便什么']
['99','皮卡猪']
['100', '']
['101',空]
['102',',']

在PHP中有没有实现这一点的方法

更新1:@deceze好心地发给我,说CSV中没有空值(TL;DR,因为XML中基本上没有空值,从那时起就出现了这个问题。)那么如何用空值解析CSV呢

更新2:我有建议使用
preg\u match.*
函数在PHP中创建一个专用解析器。我有点不愿意这样做,因为1)与
str_getcsv
相比,性能会受到影响,2)如果传递的字符串超过8kb(可能发生在CSV上下文中),则使用事实
preg_match
进行分段

更新3:我查看了
str\u getcsv
,看看是否可以像在其他一些语言中一样提出一个补丁来添加解析选项。我现在更好地理解了PHP的基本原理@daniel-vérité提出了实现一个状态机来解析CSV字符串的想法。即使使用嵌入的CSV结构,输入可以有数千行,重数十千字节,但这可能是最好的方法


谢谢您的帮助。

CSV没有任何类型信息,字符串和数字之间甚至没有任何区别。无值和空字符串在CSV中的含义相同。如果您想区分这些,您需要编写自己的CSV解析器。或者在将它们作为参数发送之前指定特殊值而不是空值(-1),这与类型有关。“无值”和“空字符串”在CSV中无法区分,因为它只有字符串类型。由于“无值”不是CSV中的可表示类型,您无法将其与“空字符串”区分开来。只有在您重新定义CSV的工作方式和/或指定您自己的CSV风格时,它才“应该”。标准CSV没有
null
。请参阅,
str_getcsv
应该符合,而您想要的区别不符合此RFC。像@deceze一样,我认为您需要编写自己的解析器。对于实现完整规范的手工有限状态机,大约需要100行代码。至于纯php的性能,您将看到:)