使用 PHP 生成 Csv - 输出不必要的引号
Generating Csv with PHP - outputting unnecessary quotation marks
我正在通过 PHP 生成和导出 CSV,经过我的团队的一些修改,现在结果是在列内生成了双引号。
我使用 CakePHP 控制台执行这个 Shell 脚本,通过我的终端生成它。
/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 */
}
然而,它只发生在姓氏和名字中有一个以上的单词被生成引号。
一个字组成的姓氏和名字,看起来还可以。
不过,名称中可能存在一些异常,其中包含空格,因此会再次生成双引号。我不太清楚为什么会这样。
我可以附上两个屏幕截图,以便您更好地了解问题。
如果您知道它可能是什么,我们将不胜感激。
这是我生成 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);
}
谢谢
不要使用 fputcsv
,请尝试 implode
。
参考:https://www.php.net/manual/en/function.implode.php
更新 1:您必须确保您的值不包含 , (comma)
更新 2:如果您担心引用的文本会成为您的 CSV 数据表的问题,那么您需要知道 CSV 的设计目的是在值之间存在任何 space .所以你不必担心。任何 CSV 解析器都会正确理解引用的值。
我正在通过 PHP 生成和导出 CSV,经过我的团队的一些修改,现在结果是在列内生成了双引号。 我使用 CakePHP 控制台执行这个 Shell 脚本,通过我的终端生成它。
/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 */
}
然而,它只发生在姓氏和名字中有一个以上的单词被生成引号。 一个字组成的姓氏和名字,看起来还可以。 不过,名称中可能存在一些异常,其中包含空格,因此会再次生成双引号。我不太清楚为什么会这样。 我可以附上两个屏幕截图,以便您更好地了解问题。
如果您知道它可能是什么,我们将不胜感激。 这是我生成 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);
}
谢谢
不要使用 fputcsv
,请尝试 implode
。
参考:https://www.php.net/manual/en/function.implode.php
更新 1:您必须确保您的值不包含 , (comma)
更新 2:如果您担心引用的文本会成为您的 CSV 数据表的问题,那么您需要知道 CSV 的设计目的是在值之间存在任何 space .所以你不必担心。任何 CSV 解析器都会正确理解引用的值。