用PHP生成Csv - 输出不必要的引号

问题描述 投票:-1回答:1

我正在通过PHP生成和导出一个CSV,经过我的团队的一些修改,现在的结果是在一列里面,生成了双引号,我通过终端执行这个Shell脚本与CakePHP Console生成。

/var/www/mysite.new/trunk/app/Console/cake Csv mysite.uk

问题是,我已经尝试了很多技术来剥离它们,如。stripslashes(), str_replace(), trim()

在我上次的修改中,我尝试应用str_replace函数。

   foreach ($persons_csv as $person_csv){
       /* The part where I get the data for stripping off the quotation marks */
        $mail = $person_csv['Person']['email'];
        $name = str_replace('"', '', $person_csv['Person']['name']);
        $surname = str_replace('"', '', $person_csv['Person']['surname']);
         /* REST OF THE CODE */

    }

然而,它只发生在有多个单词的姓氏和名字中,其中引号正在生成.姓氏和名字是由一个单词组成的,他们似乎是好的.仍然有一些异常,可能是在有空格的名字里面,因此双引号再次生成。我不太清楚为什么会发生这种情况,我可以给你附上两张截图,这样你就可以更好地了解这个问题。

enter image description here

enter image description here

如果你有任何想法,它可能是什么,这将是非常感激。这是我的代码的其余部分,我在其中生成CSV。

   private function addRow($row) {
            $rows_deleted = 0;
         if (!empty($row)){
            fputcsv($this->buffer, $row, $this->delimiter, $this->enclosure);
         } else {
                return false;
         }
    }

   private function renderHeaders() {
        header("Content-type:application/vnd.ms-excel");
        header("Content-disposition:attachment;filename=" . $this->filename);
    }

   private function setFilename($filename) {
        $this->filename = $filename;
        if (strtolower(substr($this->filename,   -4)) != '.csv') {
            $this->filename .= '.csv';
        }
    }

  private function render($filename = true, $to_encoding = null, $from_encoding = "auto") {
    if(PAIS) {
        if ($filename) {
            if (is_string($filename)) {
                $this->setFilename($filename);
            }
            $this->renderHeaders();
        }
        rewind($this->buffer);
        $output = stream_get_contents($this->buffer);

       $url = '/var/www/mysite.new/trunk/' .'app'.DS.'webroot'.DS.'csv'.DS.PAIS.DS.$this->filename;
        $gestor = fopen($url, "w+") or die("Unable to open file");
        if(file_exists($url)){
            file_put_contents($url, $output);
            chmod($url, 0777);
            fclose($gestor);
        } else {
            return false;
        }
    } else {
        return false;
    }
}

 public function csv_persons($persons_csv) {
    $this->array_final = [self::NAME, self::SURNAME]; 
    date_default_timezone_get('Europe/Madrid');
    $d = date("Ymd");
    $this->addRow($this->array_final);

    foreach ($persons_csv as $person_csv){
        $name = str_replace('"', '', $person_csv['Person']['name']);
        $surname = str_replace('"', '', $person_csv['Person']['surname']);

        $apos = ''';
        $pos = strpos($surname, $apos);
        if($pos !== false) {
            $surname = str_replace(''', '\'', $surname);
        }

        $arr = array();
        $arr[$this->getArrayKeyIndex($this->array_final, self::NAME)] = $name;
        $arr[$this->getArrayKeyIndex($this->array_final, self::SURNAME)] = $surname;

        $this->addRow($arr);
    }
    $filename = 'PERSON_PROFILE_' . $d;
    $this->render($filename);
}

谢谢你

php csv export-to-csv str-replace quotation-marks
1个回答
0
投票

而不是使用 fputcsv试试 implode.

参考文献 https:/www.php.netmanualenfunction.implode.php

更新1:你必须确保你的值不包含 , (comma)

更新2:如果你担心引用的文本会对你的CSV数据表造成问题,那么你需要知道CSV是设计成在数值之间有空格的。所以你不必担心这个问题。任何CSV解析器都能正确理解引用的值。

© www.soinside.com 2019 - 2024. All rights reserved.