【问题标题】:SQL to PHP to CSV most efficient methodSQL to PHP to CSV 最有效的方法
【发布时间】:2014-06-03 10:41:46
【问题描述】:

我只是想仔细检查使用从数据库检索的数据使用 PHP 写入 CSV 文件的最有效方法。

目前在执行我的 sql 查询以检索数据后,我正在使用 while 循环将数据分配给变量,然后在该 while 循环中写入文件。 像这样

$fp = fopen("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", 'a+');
$data = array();

while ($row = sqlsrv_fetch_array($getList,  SQLSRV_FETCH_ASSOC)) { 
     $data['id'] = $row['id'];
     $data['empId'] = $row['empId'];
     $data['fullname'] = $row['fullname'];
     $data['title'] = $row['title'];
     $data['department'] = $row['department'];

    fputcsv($fp, array_values($data));
}       

fclose($fp); 

我想知道将每次迭代的数据分配给 csv 格式的字符串变量是否会更快,然后在整个循环中将其连接起来。 然后一旦循环完成,将该变量写入文件? 那会更快吗?还是有另一种更高效的完全写入 csv 文件的方法?

【问题讨论】:

  • 您对 $data 数组所做的操作完全是多余的。 fputcsv($fp, $row) 可能会做同样的事情,或者至少 fputcsv($fp, array($row['id'], ...)) 如果您需要重新排序列。就性能而言,就 PHP 的参与而言,这应该已经很好了。

标签: php sql csv fopen fputcsv


【解决方案1】:

从你的例子来看,PHP 似乎没有对数据做任何事情,那么为什么不避免几乎所有的 PHP 交互呢?大多数数据库都有完全避免 PHP 并直接编写 CSV 文件的方法

例如MySQLSELECT ... INTO

从例子:

SELECT a,b,a+b INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;

【讨论】:

  • 从未想过这个 - 不错的解决方案。效果最好,如果数据库可以访问与需要跟进 csv 文件的进程相同的磁盘空间
【解决方案2】:

如果你能负担得起将整个文件放在内存中,我会这样做:

$outarr = array();
while ($row = sqlsrv_fetch_array($getList,  SQLSRV_FETCH_NUMERIC)) { 
   array_push($outarr,implode(";",$row));
}
file_put_contents("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", implode($outarr,"\n"));

有一些取舍:

  • 您的 sql 语句应该只返回 csv 中需要的列
  • 您的单元格分隔符是固定的 => ;
  • 您的行分隔符已固定 => 换行符(UNIX 编码)
  • 正确的 csv 编码会将包含单元格或行分隔符的值包含在引号中 -> 您的字段名称导致假设,在您的情况下不需要这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多