2013-10-01 3 views
0

У меня есть следующий CSV файл:PHP fgetcsv - обнаруживая слишком много записей

"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, поэтому некоторые текстовые поля имеют все виды кода программирования).

ответ

1

Эта строка не правильно спаслось:

" 
\""&gt;.&lt;/&gt;""; 
" 

Всех цитаты символы должны иметь обратные косую черту перед ними (или другим побегом полукокса, что вы перешли в соответствующие пары И вы should't передать 0 и запятую. к fgetcsv, они уже по умолчанию: http://php.net/fgetcsv

+0

Таким образом, решение было бы искать все символы кавычек и добавлять обратную косую черту, кроме случаев, когда она соответствует моему правильному разделителю строк (",")? – tucson

1

Попробуйте открыть файл с помощью 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; 
+0

Спасибо за подсказку. CSVed также имеет проблему анализа данных и обнаружил множество ошибок. Я не уверен, что делать дальше ... – tucson

+1

Попробуйте исправить результат анализа. Это было бы в каждом случае. –

Смежные вопросы