У меня есть следующий файл csv:
"Id","Title","Body","Tags" "101","this title"," \"">.</>""; ","c# asp.net excel table"
который я хочу преобразовать в массив следующим образом:
Array ( [0] => Array ( [0] => Id [1] => Title [2] => Body [3] => Tags ) [1] => Array ( [0] => 101 [1] => this title [2] => \"">.</>""; [3] => c# asp.net excel table ) )
Мой код:
while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $num = count($data); for ($c=0; $c < $num; $c++) { $data[$c] = strip_tags($data[$c]); } $result[$row] = $data; $row++; } fclose($handle); return $result;
Моя проблема в том, что я получаю следующий массив:
Array ( [0] => Array ( [0] => Id [1] => Title [2] => Body [3] => Tags ) [1] => Array ( [0] => 101 [1] => this title [2] => \">.</>""; ) [2] => Array ( [0] => ,c# asp.net excel table" ) )
В общем, как мне избежать обнаружения слишком большого количества рек, когда есть потенциальный код внутри полей (это дамп данных StackOverflow, поэтому некоторые текстовые поля имеют все виды кода программирования).
Эта строка неправильно экранирована:
" \"">.</>""; "
Все символы кавычек должны иметь перед ними обратную косую черту (или другой escape-символ, который вы передали в соответствующий параметр. И вы должны передать 0 и запятую в fgetcsv, они уже по умолчанию: http://php.net/fgetcsv
Попробуйте открыть файл с помощью CSVed, чтобы убедиться, что он был правильно отформатирован как CSV.
Если CSV нарушен, вы можете быстро исправить результат анализа. Например:
while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $num = count($data); for ($c=0; $c < $num; $c++) { $data[$c] = strip_tags($data[$c]); } if (count($data) == 3) { $data[1][2] .= $data[2].[0]; unset($data[2]); } $result[$row] = $data; $row++; } fclose($handle); return $result;
неwhile (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $num = count($data); for ($c=0; $c < $num; $c++) { $data[$c] = strip_tags($data[$c]); } if (count($data) == 3) { $data[1][2] .= $data[2].[0]; unset($data[2]); } $result[$row] = $data; $row++; } fclose($handle); return $result;