【问题标题】:PHP Wrap ALL fields in quotes fputcsv()PHP 将所有字段用引号括起来 fputcsv()
【发布时间】:2021-03-02 17:44:10
【问题描述】:

我对 PHP 比较陌生,所以请多多包涵。

我的代码目前如下所示:

<?php

require("database.php");

$localfile = "FileName.csv";
$fp = fopen($localfile, "w"); 
$enclosure = '"';
$delimiter = ',';

if(!$link)
{
    echo "DB Connection ERROR";
}

$query = "SELECT * FROM A_Table WHERE Stuff";

$result=mysqli_query($link,$query);

while($row = mysqli_fetch_assoc($result))
    {
        fputcsv($fp,$row,$delimiter,$enclosure);
    }

fclose($localfile);

?>

这按预期工作,但是,客户端要求所有字段都用引号括起来,而不仅仅是那些包含空格的字段。我在网上看到了很多解决方案,但它们似乎都过于复杂,或者似乎建议我应该在 CSV 导出后对其进行编辑。

如果是这样的话,我会坚持下去,但是有没有人有一个相对简单的解决方案来解决我的困境?

示例

正常代码会输出:col1,col2,"col 3",col4

我想输出:"col1","col2","col 3","col4"

任何帮助将不胜感激。

提前致谢, 保罗

【问题讨论】:

    标签: php mysql quotes fputcsv


    【解决方案1】:

    试试这个以获得灵感。您可以将 fputcsv()$row 参数替换为您在我的演示中看到的 array_map() 行:

    <?php
    
    // Sample values
    $unquoted = ['these', 'are', 'some', 'unquoted', 'example', 'values'];
    
    // One-liner to quote every array element and output to new array.
    $quoted = array_map(function ($element) { return "\"$element\""; }, $unquoted);
    
    var_dump($quoted);
    /*
    Output:
    array(6) {
      [0]=>
      string(7) ""these""
      [1]=>
      string(5) ""are""
      [2]=>
      string(6) ""some""
      [3]=>
      string(10) ""unquoted""
      [4]=>
      string(9) ""example""
      [5]=>
      string(8) ""values""
    }
    */
    

    【讨论】:

    • 嗨,谢谢你的帮助...我快到了!我想,我现在有 $result=mysqli_query($link,$query); while($row = mysqli_fetch_assoc($result)) { $quoted = array_map(function ($element) { return "\"$element\""; }, $row); fputcsv($fp,$quoted);这会输出用引号括起来的字段......但是两边各有 3 个所以“”“col1”“”,你知道我的下一步是什么吗?
    • 尝试用return '"' . trim($element, '"') . '"'替换return "\"$element\""
    • 我认为这是正确的方向,但它返回的是同样的东西。就好像它用引号括起来一样。我的意思是如果我写 return ' '.$element,' ' 我会返回“ col1 ”。
    • 如果您的某些字段已经被双引号引起来,那么您可以省略 'enclosure' 参数,并结合我的array_map() 单行(包括trim())。
    • 已找到解决方案!您的方法很棒,我非常感谢您,因为您向我介绍了 array_map 的可能性,但是,解决方案是使用 fwrite 而不是 fputcsv 完整解决方案 while($row = mysqli_fetch_array($result, MYSQLI_NUM)) { fwrite($fp, '"'.implode('","', $row) . "\"\r\n"); }
    最近更新 更多