Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP捕获文件输出(fputcsv)_Php - Fatal编程技术网

用PHP捕获文件输出(fputcsv)

用PHP捕获文件输出(fputcsv),php,Php,我试图捕获fputcsv()的输出,以便使用gzwrite()实际写入制表符分隔的文件。基本上,我正在查询一个数据库,我想将这些行放入一个gzip CSV文件中,我宁愿使用fputcsv(),而不是在任何地方添加“\t”和“\n”。我可以用输出缓冲或类似的方法来实现这一点吗 以下是我的基本情况: $results = get_data_from_db(); $fp = gzopen($file_name, 'w'); if($fp) { foreach ($results as $row

我试图捕获
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处理—这是否正确?

您可以通过编写自己的代码来拦截对底层文件的写入


编辑:阅读此页面上的规范后,您可能会感兴趣

也许我误解了这个问题,但操作的是文件句柄,这是gzopen返回的,因此您可以执行以下操作:

$results = get_data_from_db();
$fp = gzopen($file_name, 'w');
if($fp) {
    foreach ($results as $row) {
        fputcsv($fp, $row);
    }
    gzclose($fp);
}
我已经对此进行了测试,效果很好。

继续阅读,您可以尝试以下小技巧:

<?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);
?>


这实际上是您试图避免的(捕获输出),但是捕获是一个非常强大的工具,为什么不使用它呢?

不要忘记,您可以随时手动执行此操作,而无需使用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);

我不知道你可以这么做…很有趣。(rubs chin)强制内存中的数据写入临时文件可能会减少ram使用,但会降低应用程序的速度,请谨慎使用。你能评论一下为什么使用rewind()?当你将内容放入文件时,其指针指向文件的结尾。使用rewind()您将文件指针重置为文件的开头,这允许您从开始到EOF读取全部内容。这非常棒。谢谢,伙计!您不需要使用gzwrite()来正确写入文件吗?我一开始无法使其正确显示(不相关的错误),但是,是的-显然是fputcsv()这似乎不包括在字符串本身中有分隔符的可能性,也不包括当字符串中存在双引号时,它们前面应该有另一个双引号来转义的事实