【问题标题】:how to escape the delimiter from the column content when export csv导出csv时如何从列内容中转义分隔符
【发布时间】:2012-04-19 11:11:56
【问题描述】:

我要导出 CSV 文件,分隔符是“,”逗号,但如果列内容有逗号,则会出现问题,在查看 libre office calc 时会破坏 csv 输出。

如果有人可以帮我解决这个问题

到现在为止

//$filename = $row['fileName'].'-ConsignmentInfo.csv';
$filename="test.csv";
$delim = ',';
$columns = array('0Product_Number', 'Product_Name', 'Alternative_Title');
echo implode($delim,$columns )."\n";           

$ptr1 = DD_Db::fetch("SELECT p.pNum,p.pName,a.varcharValue FROM ds_products p   left join productAttribute a on a.id=p.pID where a.attributeId= (select id FROM attribute where attributeName='alternateTitle') ");

 foreach ($ptr1 as $row) {
      $line = array("\"{$row['pNum']}\"","\"{$row['pName']}\"","\"{$row['varcharValue']}\"");
      echo implode($delim,$line)."\n";
 }

header('Content-Type: text/csv');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header('Content-Disposition: attachment; filename='.$filename);
header('Pragma: cache');
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
exit;

【问题讨论】:

  • 如果这是 Perl,我会说“使用 Text::CSV”……PHP 没有可用的 CSV 库吗?轮子改造通常不是一个好主意,而 CVS 生成是一个很常见的轮子。

标签: php mysql csv export


【解决方案1】:

只需使用 fputcsv 它负责转义并生成正确的 csv 数据。

<?php

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);
?>

输出:

aaa,bbb,ccc,dddd
123,456,789
"""aaa""","""bbb"""

编辑

您始终可以使用tmpfile 的组合打开一个将在请求结束时自动删除的文件,写入该文件,然后在创建报告后使用fread 输出其内容。你必须使用 fread 因为 tmpfile 返回一个资源,否则你可以使用tempnam + file_get_contents 但在这种情况下你必须打开文件并自己阅读后进行清理。

【讨论】:

  • 这个东西的问题我的客户想在生成 csv 后下载它
【解决方案2】:

通常的做法是用一对"包裹一段数据,并用""表示数据中的双引号字符。

foo,bar,"sometimes you get data containing a "","" character","23,000"

【讨论】:

  • 请告诉我怎么做
  • " 字符进行字符串替换,然后回显"\"$foo\""
  • 对不起仍然没有得到你想要告诉我的分隔符是什么,而不是一个“
【解决方案3】:

【讨论】:

    【解决方案4】:

    您可以使用 SELECT .. INTO OUTFILE 从查询中执行此操作 例如

    SELECT p.pNum, p.pName, a.varcharValue
    FROM ds_products p   
    LEFT JOIN productAttribute a ON a.id=p.pID 
    WHERE a.attributeId = (select id FROM attribute where attributeName='alternateTitle')
    INTO OUTFILE '/path/on/server'
    

    如果要添加标题行:

    SELECT 'A', 'B', 'C'
    UNION
    SELECT p.pNum, p.pName, a.varcharValue
    FROM ds_products p   
    LEFT JOIN productAttribute a ON a.id=p.pID 
    WHERE a.attributeId = (select id FROM attribute where attributeName='alternateTitle')
    INTO OUTFILE '/path/on/server'
    

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 1970-01-01
      • 2014-08-14
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多