У меня есть выходные данные базы данных, как следующие:
$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 любезно послал меня эта ссылка заявив, что в CSV нет NULL (TL; DR, потому что в XML не было нулей в принципе, эта проблема был решен с тех пор.) Как тогда анализировать CSV с NULL?
Обновление 2: У меня были предложения по созданию выделенного парсера в PHP с использованием preg_match_*
функции. Я немного не хочу идти по этому пути, потому что 1) влияние на производительность по сравнению с str_getcsv
и 2) факт preg_match
используется для segfault, если длина передаваемой строки превышает 8 КБ (что может происходить в контексте CSV).
Обновление 3: я смотрел на str_getcsv
исходный код чтобы увидеть, можно ли было предложить патч для добавления параметров синтаксического анализа, как это делается на некоторых других языках. Теперь я лучше понимаю основную философию PHP. @ daniel-vérité предложила реализовать конечный автомат для разбора строк CSV. Несмотря на то, что входные данные могут иметь тысячи строк, которые весят десятки килобайт со встроенными CSV-структурами, это может быть лучшим способом.
Спасибо за помощь.
Задача ещё не решена.
Других решений пока нет …