用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()这似乎不包括在字符串本身中有分隔符的可能性,也不包括当字符串中存在双引号时,它们前面应该有另一个双引号来转义的事实