Как я могу отформатировать данные CSV, чтобы показывать специальные символы, но видеть их только как текст в MS Excel или Calc? - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть скрипт для экспорта данных из MYSQL в файл CSV.данные числа, текст и специальные символы.Все поля разделяются двойными кавычками и разделяются запятыми.

Мне нужно экспортировать данные в следующем виде:

"это предложение (x2") плохо грамматизировано.Да, «нет», может быть и больше »,« 0043 »,« ложь »и т. Д.

Однако я могу заставить его работать только тогда, когда применяю htmlsepcialchars к каждому полю. Данные должны оставаться каквыше, но когда дело доходит до Excel или Calc, некоторые из запятых и одинарных кавычек и т. д. облажаются. Это означает, что некоторые предложения находятся в одной ячейке, а другие в другой.

$dataResult = mysql_query("SELECT * FROM data");

while ($rowData = mysql_fetch_row($dataResult)) 
{
    for ($j=0;$j<32;$j++) 
    {
        $csv_output .= '"'.htmlspecialchars($rowData[$j]).'",';
    }

$csv_output .= "\n";

}

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

Согласно википедии , вы можете избежать двойной кавычки, удвоив ее (например, "this is a (x2"") badly grammorize'd sentence. Yes, ""no"", maybe & more.","0043","false"). Это также должно исправить проблему с запятыми, и я не могу сказать, почему одиночные кавычки были бы проблемой ...

1 голос
/ 16 апреля 2011

Встроенная функция fputcsv позаботится обо всем, что необходимо для вывода действительного csv.К сожалению, он может выводиться только в файл, но в комментариях есть обходной путь, кредит идет на Guile :

<?php
function outputCSV($data) {

    $outstream = fopen("php://output", 'w');

    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals, ';', '"');
    }
    array_walk($data, '__outputCSV', $outstream);

    fclose($outstream);
}

$mydata = array(
 array('data11', 'data12', 'data13'),
 array('data21', 'data22', 'data23'),
 array('data31', 'data32', 'data23'));

outputCSV($mydata);
/* Output sent :
data11;data12;data13
data21;data22;data23
data31;data32;data23
*/
1 голос
/ 16 апреля 2011

htmlspecialchars предназначен только для экранирования данных, вставленных в HTML (как следует из названия функции). Для данных CSV рассмотрите возможность написания функции, соответствующей стандарту CSV, особенно с использованием двух кавычек вместо одной.

Например:

function csvspecialchars($msg) {
  return str_replace('"', '""', $msg);
}

Могут быть и другие персонажи, которые могут сбежать. Проверьте стандарт на RFC 4180 .

...