PHP файл, генерирующий CSV, как правильно выводить текст - PullRequest
2 голосов
/ 22 октября 2010

В настоящее время я работаю над сценарием PHP для вывода файла CSV из записей в базе данных MySQL. Моя проблема заключается в том, как правильно вывести значения. Многие записи в базе данных MySQL будут содержать запятые и кавычки, которые разрушают формат файла CSV, если я просто распечатаю их в файл.

Мне известно, что я могу заключить текст в кавычки, но записи, содержащие кавычки, могут испортить формат файла.

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

Кроме того, новые строки влияют на интерпретацию файла?

Кроме того, я бы предпочел не использовать функцию fputcsv в PHP. Я пытаюсь заставить PHP-скрипт выводить содержимое файла (с соответствующими заголовками), а не записывать в новый файл.

Заранее спасибо!

С уважением, celestialorb

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

Я думаю, что ваше увольнение из fputcsv было преждевременным. В комментариях к руководству fputcsv есть пример, где они используют fputcsv для вывода в браузер вместо файла. http://php.net/manual/en/function.fputcsv.php

Вот этот код, а также некоторые заголовки, показывающие, что он действительно побуждает пользователя загрузить файл CSV.

$mydata = array(
 array('data11', 'data12', 'data13'),
 array('data21', 'data22', 'data23'),
 array('data31', 'data32', 'data23'));
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"my-data.csv\"");
outputCSV($mydata);

function outputCSV($data) {
    $outstream = fopen("php://output", 'w');
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals, ';', '"');
    }
    array_walk($data, '__outputCSV', $outstream);
    fclose($outstream);
}
0 голосов
/ 22 октября 2010

Процесс называется , экранирующий , и большинство анализаторов (включая PHP) используют обратную косую черту для экранирования символов:

"This string contains literal \"quotes\" denoted by backslashes"

Вы можете экранировать символы в строке с addcslashes:

// escape double-quotes
$string = addcslashes('this string contains "quotes"', '"');

echo $string; // 'this string contains \"quotes\"'

Учитывая массив данных, которые вы хотите разделить запятыми, вы можете сделать следующее:

// Escape all double-quotes
foreach ($data as $key => $value)
  $data[$key] = addcslashes($value, '"');

// Wrap each element in double quotes
echo '"' . implode('", "', $data), '"';
0 голосов
/ 22 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...