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

时间:2010-09-28 22:51:32

标签: php csv

因此,我的代码使用PHP的内置fputcsv函数生成CSV文件。

对于分隔符,我使用','(逗号) 对于机箱,我使用'"'(双引号)。

然而,当我尝试像

这样的东西时
fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"');

输出

a,b,"long string, with commas",,

但我想输出

"a","b","long string, with commas","",""

有没有一种简单的方法可以解决这个问题,还是我必须为fputcsv写一个替代品?

5 个答案:

答案 0 :(得分:9)

对于CSV文件,这通常不是问题。

如果fputcsv不明确,则会在值周围加上引号。例如,

a,b,"long string, with commas",,

不含糊,但是,

a,b,long string, with commas,,

是,并且在大多数(读取:所有)情况下,CSV读取器将其解释为具有5个以上的字段。

CSV解析器即使没有引号,也会接受字符串文字。

如果您想要围绕值进行引用,则以下代码段会执行此操作。它不会逃避字符串中的引号 - 该练习留给读者:

$row = '"' . implode('", "', $rowitems) . '"';

您可能希望将其置于所有行的循环中。

答案 1 :(得分: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);

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

答案 2 :(得分:2)

我认为解决方案就是这样,

$order_header_arr = array("Item1", "Item2","This is Item3");
fputcsv($fp, $order_header_arr,',',' ');

记住" " [空格]在fputcsv的第三个参数

之间

答案 3 :(得分:0)

你有什么理由不能str_replace(',,',',“”,',$ output); ?您还必须查看最后一个或第一个字符是否为逗号,如果是,请将逗号替换为“”

答案 4 :(得分:0)

fputcsv不会将所有数组变量括在引号中。具有不带引号的数值数组值可能是正确的,但是当标签或地址程序遇到数字定义的美国邮政编码时会出现问题,因为它将在打印时去除前导零。因此05123-0019变为5123-19。

要在引号中包含所有值,无论它们是否存在,我使用fgetsrc读取输入文件并使用fwrite写入更正的版本。 fgetsrc将记录读入数组变量。由于fwrite写入变量,因此必须对数组变量进行字符串处理,将它们用引号括起来并用逗号分隔数组变量。然后添加记录分隔符。

<?php
// fgetcsv - read array with fgetcsv and string into output variable 
// then write with fwrite
// $ar is the array populated from fgetcsv and $arc is the variable strung 
// with array variables enclosed in quotes and written using fwrite.
$file_in = fopen("reinOCp.csv","r") or die("Unable to open input file 
reinOCp.csv!"); 
$file_out = fopen("printLABEL.csv", "w") or die("Unable to open output file 
prtLABEL!");
while (!feof($file_in)) {  //loop through each record of the input file
    $ar=fgetcsv($file_in); //read the record into array $ar   
    if (is_array($ar)){ //this loop will string all the array values plus 
// the end of record into variable $arc and then write the variable 
        $arc = ""; //clear variable $arc  
        foreach ($ar as $value) {      
            $arc .= '"' . $value . '",'; // add the array values, enclose in 
// quotes with comma separator and store in variable $arc
        }   
        $arc .= "\n"; //add end of record to variable $arc
        fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); 
//write the record using variable $arc
    }
}
echo "end of job";
fclose($file_in);
fclose($file_out);
?>