簡體   English   中英

在PHP中捕獲文件輸出(fputcsv)

[英]Capturing file output in PHP (fputcsv)

我試圖捕獲fputcsv()的輸出,以便使用gzwrite()實際寫入制表符分隔文件。 基本上,我正在查詢數據庫,我想將這些行放入一個gzip壓縮的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()需要用來實際寫入文件,以便實際上是gzip - 這是不正確的?

正如在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);
?>

這實際上是你試圖避免的(捕獲輸出),但捕獲是一個非常強大的工具,所以為什么不使用它呢?

也許我誤解了這個問題,但是fputcsv()對文件句柄進行操作,這就是gzopen返回的,所以你可以這樣做:

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

我已經測試了這個,它運行正常。

您可以通過編寫自己的流處理程序來攔截對底層文件的寫入。

編輯:閱讀此頁面上的規范示例3后聽起來可能是您感興趣的

不要忘記,您可以在不使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM