CSV输入中空值的不同空字符串

时间:2017-02-20 14:35:48

标签: php csv null

我有如下数据库输出:

$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结构,但它可能是最佳方式。

感谢您的帮助。

0 个答案:

没有答案
相关问题