【问题标题】:php export data to custom CSVphp 将数据导出到自定义 CSV
【发布时间】:2021-10-18 20:37:36
【问题描述】:

我正在编写一个函数来将我的数据导出到 csv。 我想要的是每个数据都应该用双引号引起来。 在我发现问题之前它工作正常:

输出如下正常数据为例

"Hello";"1232323"; 

显示正常。只有数据之间有空格时才会出现问题

"Hello world"

在引号前后加一个空格和一个空格。

谁能帮助我如何删除这个多余的空间,或者我做错了什么,

   protected function outputCSV($data, $delimeter = ';',$enclosure = " ") {
        $output = fopen("php://output", "w");
        foreach ($data as $row) {
            fputcsv($output, $row,$delimeter, $enclosure);
        }
        fclose($output);
    }

    public function ExportCsv($id)
    {
        if(!$id) return false;

        /* Headers */
        header("Content-type: text/csv");
        header("Content-Disposition: attachment; filename=result_file.csv");
        header("Pragma: no-cache");
        header("Expires: 0");


        /*  get Reiseverlauf Data */
        $rf = $this->getReiseVerlaufByDatasetId($id);
    
        if($rf[0]){
            foreach ($rf as $rv){
                $dataata[] = array('"'.date("d.m.y l", strtotime($rv['date_from'])).'"','"'.date("d.m.y", strtotime($rv['date_to'])).'"','"'.$rv["service"].'"','"'.$rv["location"].'"');
            }
        }
        $this->outputCSV($data, ";" , " " );

        exit ;
    }

【问题讨论】:

  • $dataata 应该是 $data 吗?
  • $enclosure = " " 应该是$enclosure = ""
  • 如果您处理$dataata,那么它会添加双引号,而您不希望这样。还有为什么你默认使用" " 作为enclosure 而不是双引号?
  • 当我将附件更改为“” fputcsv() 时,它给了我这个错误:附件必须是一个字符,如果我使用 '"' 这作为 eclosure,它会给我 3 qouted 中的所有内容,如 """你好"""

标签: php csv fputcsv


【解决方案1】:

您使用空格作为分隔符。 您的代码中还有一些其他小问题。

试试这个代码:

   protected function outputCSV($data, $delimeter = ';' ,$enclosure = "") {
        $output = fopen("php://output", "w");
        foreach ($data as $row) {
            fputcsv($output, $row, $delimeter, $enclosure);
        }
        fclose($output);
    }

    public function ExportCsv($id)
    {
        if(!$id) return false;

        /* Headers */
        header("Content-type: text/csv");
        header("Content-Disposition: attachment; filename=result_file.csv");
        header("Pragma: no-cache");
        header("Expires: 0");


        /*  get Reiseverlauf Data */
        $rf = $this->getReiseVerlaufByDatasetId($id);
    
        if($rf[0]){
            foreach ($rf as $rv){
                $data[] = array('"'.date("d.m.y l", strtotime($rv['date_from'])).'"','"'.date("d.m.y", strtotime($rv['date_to'])).'"','"'.$rv["service"].'"','"'.$rv["location"].'"');
            }
        }
        $this->outputCSV($data, ";" , "");

        exit ;
    }

【讨论】:

  • 当我将附件更改为“” fputcsv() 时,它给了我这个错误:附件必须是一个字符,如果我使用 '"' 这作为 eclosure,它会给我 3 qouted 中的所有内容,如 """你好"""
  • 好的。如果你使用chr(127) 作为分隔符呢?
  • 它给了我与以前相同的结果,例如我在 "18.08.21";"18.08.21"; 行中有这个东西"Amazon Test" ;"aaeeeeeeeee";"a";"REG/ESP/Standard/ENG" 一切正常,直到出现一个空格 ex(amazon Test) 双引号前后都有一个空格。
【解决方案2】:

来自documentation

注意

如果字段中包含enclosure 字符,则会通过将其加倍来进行转义,除非它前面紧跟escape_char

由于您设置了$enclosure = " ",任何未转义的空格字符都会加倍。

如果您不希望它添加附件字符,因为您在调用者中将所有内容都用引号括起来,请使用 $enclosure = ""

【讨论】:

  • 当我将附件更改为“” fputcsv() 时出现此错误:附件必须是字符
  • 那么我认为你不能用fputcsv() 做到这一点。为什么需要在所有字段周围加上引号?这不是标准的 CSV 格式。