Захват вывода файла в PHP (fputcsv) - PullRequest
2 голосов
/ 06 января 2009

Я пытаюсь захватить вывод fputcsv(), чтобы использовать gzwrite() для фактической записи в файл с разделителями табуляции. По сути, я запрашиваю базу данных и хочу поместить эти строки в сжатый CSV-файл, и я предпочел бы использовать fputcsv(), а не добавлять "\t" и "\n" везде. Можно ли как-то сделать это с помощью буферизации вывода или чего-то подобного?

Вот основная схема того, что у меня есть:

$results = get_data_from_db();
$fp = gzopen($file_name, 'w');
if($fp) {
    foreach ($results as $row) {
        ???//something with gzwrite() ?
    }
    gzclose($fp);
}

Спасибо!

РЕДАКТИРОВАТЬ: Насколько я понимаю, gzwrite() необходимо использовать для фактической записи в файл для того, чтобы он действительно был заархивирован - это не правильно?

Ответы [ 4 ]

16 голосов
/ 06 января 2009

Как читается на php.net , вы можете попробовать этот маленький трюк:

<?php
// output up to 5MB is kept in memory, if it becomes bigger
// it will automatically be written to a temporary file
$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');

fputcsv($csv, array('blah','blah'));

rewind($csv);

// put it all in a variable
$output = stream_get_contents($csv);
?>

Это именно то, чего вы пытались избежать (захват результатов), но захват - очень мощный инструмент, так почему бы не использовать его?

2 голосов
/ 06 января 2009

Возможно, я неправильно понимаю вопрос, но fputcsv() работает с дескриптором файла, который возвращает gzopen, так что вы можете сделать это:

$results = get_data_from_db();
$fp = gzopen($file_name, 'w');
if($fp) {
    foreach ($results as $row) {
        fputcsv($fp, $row);
    }
    gzclose($fp);
}

Я проверял это, и он отлично работает.

1 голос
/ 07 января 2009

Не забывайте, что вы всегда можете сделать это вручную, не используя функцию csv, не выполняя уже никакой работы. Мне пришлось сделать это недавно, чтобы я мог взять те же данные и вывести CSV в виде разделителей табуляции, разделителей запятыми или чего-то, что браузер мог отображать.

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

switch ( $_GET['mode'] )
{
    case "csv":
        $wrapper = "'";
        $delimiter = ",";
        $nextrow = "\n";
        break;
    case "txt":
        $wrapper = "";
        $delimiter = "\t";
        $nextrow = "\n";
        break;
    case "html":
        $wrapper = "'";
        $delimiter = ",";
        break;
}

$output = array();
$sql = "SELECT * FROM table";
$result = mysql_query($sql);
while ( $row = mysql_fetch_assoc($result) )
{
    $line = array();
    foreach ( $row as $column => $value )
    {
        $line[] = $wrapper . $value . $wrapper;
    }
    $output[] = implode("", $line) . $nextrow;
}

print implode("",$output);
1 голос
/ 06 января 2009

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

Редактировать: После прочтения спецификации пример 3 на этой странице звучит так, как будто она может вас заинтересовать

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