Разбивка php в str_getcsv по разделенному табуляцией списку без вложений и отдельных двойных кавычек

Я использую str_getcsv проанализировать значения табуляции, возвращаемые из запроса nosql, однако я сталкиваюсь с проблемой, и единственное решение, которое я нашел, является нелогичным.

Вот пример кода для демонстрации (к вашему сведению, вкладки не сохраняются при показе здесь)...

$data = '0  16  Gruesome Public Executions In North Korea - 80 Killed       http://www.youtube.com/watch?v=Dtx30AQpcjw&feature=youtube_gdata        "North Korea staged gruesome public executions of 80 people this month, some for offenses as minor as watching South Korean entertainment videos or being fou...    1384357511  http://gdata.youtube.com/feeds/api/videos/Dtx30AQpcjw   0   The Young Turks                 1   2013-11-13 12:53:31 9ab8f5607183ed258f4f98bb80f947b4    35afc4001e1a50fb463dac32de1d19e7';

$data = str_getcsv($data,"\t",NULL);

echo '<pre>'.print_r($data,TRUE).'</pre>';

Обратите особое внимание на тот факт, что один столбец (начиная с "Северная Корея...." фактически начинается с двойной кавычки " но не заканчивается с одним. Вот почему я поставляю NULL в качестве третьего параметра (вложения) переопределить значение по умолчанию " стоимость вложения.

Вот результат:

Array
(
[0] => 0
[1] => 16
[2] => Gruesome Public Executions In North Korea - 80 Killed
[3] => http://www.youtube.com/watch?v=Dtx30AQpcjw&feature=youtube_gdata
[4] => 
[5] => North Korea staged gruesome public executions of 80 people this month, some for offenses as minor as watching South Korean entertainment videos or being fou...  1384357511  http://gdata.youtube.com/feeds/api/videos/Dtx30AQpcjw   0   The Young Turks                 1   2013-11-13 12:53:31 9ab8f5607183ed258f4f98bb80f947b4    35afc4001e1a50fb463dac32de1d19e7
)

Как видите, цитата нарушает функцию. Логически я думал, что смогу использовать NULL или и пустая строка'' в качестве третьего параметра для str_getcsv (приложение), но ни один не работал?!?!

Единственное, что я мог использовать, чтобы получить str_getcsv чтобы правильно работать был космический символ ' ', Это не имеет никакого смысла для меня, потому что ни у одного из столбцов нет пробелов, начинающих и / или заканчивающих их.

$data = '0  16  Gruesome Public Executions In North Korea - 80 Killed       http://www.youtube.com/watch?v=Dtx30AQpcjw&feature=youtube_gdata        "North Korea staged gruesome public executions of 80 people this month, some for offenses as minor as watching South Korean entertainment videos or being fou...    1384357511  http://gdata.youtube.com/feeds/api/videos/Dtx30AQpcjw   0   The Young Turks                 1   2013-11-13 12:53:31 9ab8f5607183ed258f4f98bb80f947b4    35afc4001e1a50fb463dac32de1d19e7';

$data = str_getcsv($data,"\t",' ');

echo '<pre>'.print_r($data,TRUE).'</pre>';

Теперь результат:

Array
(
[0] => 0
[1] => 16
[2] => Gruesome Public Executions In North Korea - 80 Killed
[3] => http://www.youtube.com/watch?v=Dtx30AQpcjw&feature=youtube_gdata
[4] => 
[5] => "North Korea staged gruesome public executions of 80 people this month, some for offenses as minor as watching South Korean entertainment videos or being fou...
[6] => 1384357511
[7] => http://gdata.youtube.com/feeds/api/videos/Dtx30AQpcjw
[8] => 0
[9] => The Young Turks
[10] => 
[11] => 
[12] => 
[13] => 
[14] => 1
[15] => 2013-11-13 12:53:31
[16] => 9ab8f5607183ed258f4f98bb80f947b4
[17] => 35afc4001e1a50fb463dac32de1d19e7
)

Итак, мой вопрос: почему он работает с пробелом в качестве вложенности, а не с NULL или пустой строкой? И есть ли последствия для этого?

ОБНОВЛЕНИЕ 1: кажется, это уменьшило количество ошибок, которые я получал в наших журналах, но это не устранило их, поэтому я предполагаю, что Я использовал, поскольку корпус вызвал непреднамеренные побочные эффекты, хотя и менее тревожный, чем предыдущая проблема. Но мой вопрос остается тем же, почему я не могу использовать NULL или пустое пространство в качестве вложенного пространства, и, во-вторых, есть ли лучший способ справиться с этим?

1 ответ

Решение

Просто чтобы дать отправную точку...

Возможно, вы захотите поработать с самой строкой, а не использовать такую ​​функцию, как str_getcsv в твоем случае.

Но имейте в виду, что есть, по крайней мере, некоторые подводные камни, если вы выберете этот маршрут (может быть, единственный вариант):

  • Обработка сбежавших персонажей
  • Разрывы строк в данных (не подразумеваются как разделители)

Если вы знаете, что у вас нет другого TABS в вашей строке, отличной от тех, которые заканчивают поля, и у вас нет никаких разрывов строк, кроме тех, которые разделяют строку, вам может быть хорошо с этим:

$data = explode("\n", $the_whole_csv_string_block);

foreach ($data as $line)
{
    $arr = explode("\t", $line);

    // $arr[0] will have every first field of every row, $arr[1] the 2nd, ...
    // Usually this is what I want when working with a csv file

    // But if you rather want a multidimensional array, you can simply add 
    // $arr to a different array and after this loop you are good to go.
}

В противном случае это всего лишь отправная точка для вас, чтобы начать и настроить его в вашей индивидуальной ситуации, надеюсь, это поможет.

Просто использовать chr(0) как ограждение и побег:

$data = str_getcsv($data, "\t", chr(0), chr(0));
Другие вопросы по тегам