因此,我的代码使用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
写一个替代品?
答案 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);
?>