Генерация CSV с PHP - вывод ненужных кавычек - PullRequest
0 голосов
/ 27 мая 2020

Я создаю и экспортирую CSV через PHP, и после некоторых модификаций моей команды теперь получается, что внутри столбца создаются двойные кавычки. Я генерирую его через свой терминал, выполняя этот сценарий оболочки с помощью консоли Cake PHP.

/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);
}

Спасибо

1 Ответ

0 голосов
/ 27 мая 2020

Вместо использования fputcsv попробуйте implode.

Ссылка: https://www.php.net/manual/en/function.implode.php

Обновление 1: вы должны быть уверены, что ваше значение соответствует не содержать , (comma)

Обновление 2: если вас беспокоит идея о том, что этот цитируемый текст будет проблемой для вашей таблицы CSV, тогда вам нужно знать, что CSV предназначен для этого, если между Значение. Так что вам не о чем беспокоиться. Любой анализатор CSV правильно поймет цитируемые значения.

...