2009-01-06 35 views
2

我試圖捕獲fputcsv()的輸出以便使用gzwrite()實際寫入製表符分隔的文件。基本上,我正在查詢一個數據庫,我想把這些行放到一個gzipped的CSV文件中,我寧願使用fputcsv(),實際上在所有地方都會附加"\t""\n"。我可以用輸出緩衝或類似的方法做到這一點嗎?以PHP(fputcsv)捕獲文件輸出

這裏是我有什麼基本輪廓:

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

謝謝!

編輯:我的理解是,gzwrite()需要用於實際寫入文件,以便它實際上被壓縮 - 這是不正確的?

回答

2

也許我誤解了問題,但fputcsv()上的文件句柄,這是gzopen回報工作,所以你可以這樣做:

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

我測試過這個,它工作正常。

+1

你不需要使用gzwrite()寫入文件正確 – Wickethewok 2009-01-06 20:00:17

+0

我無法得到它在第一(不相關的錯誤)正常顯示,但是,是的 - 顯然fputcsv? ()本身是足夠的 – Wickethewok 2009-01-06 21:03:20

1

您可以通過編寫自己的stream handler來截取對底層文件的寫入操作。

編輯:讀取規格example 3此頁面上之後聽起來像它可能是你的興趣

16

由於閱讀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); 
?> 

這實際上是你試圖避免(捕獲它的輸出)的話,但拍攝是一個非常強大的工具,那麼爲什麼不使用它?

+1

我不知道你能做到這一點...有趣的(摩擦下巴) – 2009-01-06 19:55:41

1

不要忘記,您可以始終手動執行此操作,而無需使用csv功能,而無需再執行任何工作。我最近不得不這樣做,所以我可以採取相同的數據,並輸出CSV作爲製表符分隔,逗號分隔或瀏覽器可以顯示的東西。

所有你需要做的就是使用基本數組和implode(這裏是一個基本的例子,你需要添加一些變量來支持正確的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);