您好,匿名用户
随意问技术百科期待您的加入

PHP怎么在导出csv的时候加双引号

0 投票

用PHP输出一个csv文件

foreach ($old['lines'] as $line) {
     fputcsv($new, $line);
}

比如$line的内容是:

CA,12,Y
MU,13,Y
MU,12,N

我希望的数据:

"CA","12","Y"
"MU","13","Y"
"MU","12","N"

我这样做

foreach ($lines as &$line) {
    foreach ($line as &$column) {
        $column = '"' . $column . '"';
    }
}

结果出来每一列数据上都被加了两个双引号:

""CA"",""12"",""Y""
""MU"",""13"",""Y""
""MU"",""12"",""N""

这种方法不对,还是有其他更好的方法?

用户头像 提问 2014年 1月30日 @ Aphrodite 上等兵 (185 威望)
分享到:

1个回答

0 投票

我始终觉得 fputcsv() 挺土的 ... 不如自己实现一个 ... 也不是很麻烦 ...

当然如果你一定要用 ... 我们就要先研究一下为什么会出现多重双引号这个问题 ...

/* enclose a field that contains a delimiter, an enclosure character, or a newline */
if (FPUTCSV_FLD_CHK(delimiter) ||
	FPUTCSV_FLD_CHK(enclosure) ||
	FPUTCSV_FLD_CHK(escape_char) ||
	FPUTCSV_FLD_CHK('\n') ||
	FPUTCSV_FLD_CHK('\r') ||
	FPUTCSV_FLD_CHK('\t') ||
	FPUTCSV_FLD_CHK(' ')
) {

/ext/standard/file.c 的第 1867 - 1875 行 ...

这里描述了 enclosure ... 我翻译成 包围符 出现的规则 ...

双引号本身正是默认的包围符 ... 触发了规则 ... 导致双引号外面再加双引号造成两个双引号的结果 ...

知道了原理 ... 我们来研究对策 ...

第一种方法 ... 使用默认的双引号做包围符 ... 但是强制所有元素触发 ...

foreach ($lines as &$line) {
    foreach ($line as &$column) {
        $column = $column . ' ';
    }
}

产生的结果大概会类似于下面这样 ...

"CA ","12 ","Y "
"MU ","13 ","Y "
"MU ","12 ","N "

第二种方法 ... 我们去研究手册 ... 手册上关于这个函数的说明是这样的 ...

int fputcsv ( resource $handle , array $fields [, string $delimiter = ',' [, string $enclosure = '"' ]] )

你可以看到这个函数支持自定义包围符 ... 也就是第四个参数 $enclosure ...

于是我们可以手动在所有元素的两侧加上双引号 ... 并修改默认的包围符为空 ...

foreach ( $old['lines'] as $line ) {
     fputcsv( $new, $line, ',', ' ' );
}

这种方式可以让你的例子返回完美的结果 ...

但是如果元素触发了包围符出现规则的话 ... 就会在分隔符也就是逗号的两端出现空格 ...

你可能会好奇为什么一定要是空格 ... 因为包围符必须是一个字符 ... 不能是空也不能是 null ...

如果你确定你的元素里一定不包含会触发包围符出现的所有字符以及另外的某个字符 ...

也可以修改成另外的那个字符 ... 反正想办法永远不要触发添加包围符的规则就对了 ...

两种方法 ... 都不是很完美 ... 选择哪种就看你的需要了 ...

当然最后的最后我还是要说 ... 这个函数实在是太土了还是自己实现一个吧 ...

用户头像 回复 2014年 1月30日 @ Brand 上等兵 (185 威望)
提一个问题:

相关问题

+2 投票
1 回复 511 阅读
用户头像 提问 2013年 7月15日 @ Gangplank 上等兵 (314 威望)
0 投票
1 回复 36 阅读
用户头像 提问 2012年 12月1日 @ Gragas 上等兵 (254 威望)
0 投票
1 回复 1,638 阅读
0 投票
1 回复 52 阅读
0 投票
1 回复 28 阅读
用户头像 提问 2012年 12月1日 @ Lucia 上等兵 (416 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...