因此,我的代码使用PHP的内置fputcsv函数生成CSV文件.
对于分隔符,我使用','(逗号).
对于机箱,我使用'"'(双引号).
但是,当我尝试类似的东西时
fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"');
Run Code Online (Sandbox Code Playgroud)
它输出
a,b,"long string, with commas",,
Run Code Online (Sandbox Code Playgroud)
但我希望它输出
"a","b","long string, with commas","",""
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以解决这个问题,还是我必须为其替代fputcsv?
对于CSV文件,这通常不是问题.
如果值不明确,fputcsv会在值周围加上引号.例如,
a,b,"long string, with commas",,
Run Code Online (Sandbox Code Playgroud)
不是含糊不清的,但是,
a,b,long string, with commas,,
Run Code Online (Sandbox Code Playgroud)
是的,并且在大多数(读取:所有)情况下,CSV读取器将其解释为具有多于5个字段.
即使没有引号,CSV解析器也会接受字符串文字.
如果您想要围绕值进行引用,则以下代码段会执行此操作.它不会逃避字符串中的引号 - 该练习留给读者:
$row = '"' . implode('", "', $rowitems) . '"';
Run Code Online (Sandbox Code Playgroud)
您可能希望将其放在所有行的循环中.
我通过插入一些伪造的字符串字符,一个空格,#@ @#,然后删除它来解决这个问题.这是一个示例实现:
//$exported is our array of data to export
$filename = 'myfile.csv';
$fp = fopen($filename, 'w');
foreach ($exported as $line => $row) {
if ($line > 0) {
foreach ($row as $key => $value) {
$row[$key] = $value."#@ @#";
}
}
fputcsv($fp, $row);
}
fclose($fp);
$contents = file_get_contents($filename);
$contents = str_replace("#@ @#", "", $contents);
file_put_contents($filename, $contents);
Run Code Online (Sandbox Code Playgroud)
这用双引号括起所有字段,包括空引号
| 归档时间: |
|
| 查看次数: |
18516 次 |
| 最近记录: |