【问题标题】:Unable to remove double quotes when using fputcsv使用 fputcsv 时无法删除双引号
【发布时间】:2019-12-25 09:28:54
【问题描述】:

我创建了一个将一堆 MySQL 表导出到 csv 的脚本。脚本工作正常,除了我需要在将每一行放入 CSV 文件之前删除双引号。

我正在使用 str_replace,它在我需要替换 | 的任何实例时工作。但是由于某种原因,它不适用于双引号。我想我一定遗漏了一些明显的东西。

require_once 'mysqliconn.php';

$mysql_tables = array("OutputApplicationsView", "OutputComponentsView", "OutputDevicesView", "OutputDisksView", "OutputInstalledSoftwareView", "OutputModulesView", "OutputOraclePTVView", "ScopeListView");

    foreach ($mysql_tables as $mysql_table) {

        echo "<br> Exporting $mysql_table to CSV file. Please wait.</br>";

        $sql = "SELECT * FROM ". $mysql_table . " LIMIT 10";

        $stmt = $myconn->prepare($sql);
        if($stmt === false) {trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $myconn->error, E_USER_ERROR);}

        $execute = $stmt->execute();
        if($execute === false) {trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $myconn->error, E_USER_ERROR); exit;}

        $results = $stmt->get_result();

        $array = $results->fetch_all(MYSQLI_ASSOC);

        $file = $mysql_table . ".txt";

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

            foreach ($array as $row) {

            $row = str_replace("|", ":", $row); //works fine
            $row = str_replace('"', '', $row);  //this part won't work.
            $row = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $row);
                        $row = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', $row);

            fputcsv($fp, $row, "|");

                }

        fclose($fp);

    }

mysqli_close($myconn);
?>

【问题讨论】:

    标签: php double str-replace quotes fputcsv


    【解决方案1】:

    str_replace() 的调用应该删除双引号。可能发生的情况是fputcsv() 正在“有帮助” 将它们放回给你。您可以尝试为可选的附件参数添加一个值(如果未提供,则默认为双引号),以查看输出中的双引号是否更改为其他内容。

       fputcsv($fp, $row, "|", "^");
    

    https://www.php.net/manual/en/function.fputcsv.php

    如果结果是这样,那么您可能只需要手动输出数据,这样可能就可以解决问题。

       fwrite($fp, implode("|", $row));
    

    【讨论】:

    • 感谢您的回复。我将 fputcsv 行替换为 fwrite ($fp, implode ('|', $row));它奏效了。
    • @biggambino 我很高兴它对你有用。您是否介意将问题标记为已回答,以便将来遇到相同问题的其他人知道该尝试什么。