将PHP fputcsv()生成的CSV值包装为""

Aus*_*yde 10 php csv

因此,我的代码使用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

Tho*_*s O 9

对于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)

您可能希望将其放在所有行的循环中.


per*_*lis 8

我通过插入一些伪造的字符串字符,一个空格,#@ @#,然后删除它来解决这个问题.这是一个示例实现:

//$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)

这用双引号括起所有字段,包括空引号