9

我想将查询输出到一个 csv 文件,其中包含"所有字段的附件。

以下:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='.$strFeederFileName.'');

$output = fopen('php://output', 'r+');
$fileheader = array( "FH", "READY TO PAY", "RTP060620134", "060620134RWKN", "");
fputcsv($output, $fileheader, ",", '"');

输出这个:

FH,"准备付款",RTP060620134,060620134RWKN

但我需要它是:

"FH","准备付款","RTP060620134","060620134RWKN"

有什么想法为什么不向字段添加附件1, 3 & 4

4

3 回答 3

2

fputcsv 非常聪明地猜测哪些列需要有括号,而不是为了保持 CSV 有效。

目前它正在输出有效的 CSV。

fputcsv 没有提供强制用引号括起来的选项,最好知道为什么你需要它们都用引号引起来?

于 2013-06-06T21:01:17.087 回答
1

Gumby 的评论是正确的——如果它不需要用引号括起来,它就不会。您可以执行一些操作,例如将外壳设置为空字符串,然后将它们放在自己身上:

$fileheader = array( "FH", "READY TO PAY", "RTP060620134", "060620134RWKN", "");
for($i=0; $i<count($fileheader); $i++) 
{ 
    $fileheader[i] = '"' . $fileheader[$i] . '"'; 
}
fputcsv($output, $fileheader, ",", '');
于 2013-06-06T21:04:09.013 回答
0

感谢你的帮助。我使用了多个答案的组合,因为我需要能够选择要包含哪些字段以及不包含哪些字段。在将行写入文件之前,我在不想包含的字段周围添加了一个唯一字符串 (xxx) 并使用 str_replace:

 header('Content-Type: text/csv; charset=utf-8');
 header('Content-Disposition: attachment; filename='.$strFeederFileName.'');

 function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep)
 {
 dumbescape(false, $enclosure);
 $data_array=array_map('dumbescape',$data_array);

 $line = $enclosure 
     . implode($enclosure . $field_sep . $enclosure, $data_array)
     . $enclosure . $record_sep;

 $line = str_replace('"xxx', '', $line);
 $line = str_replace('xxx"', '', $line);

 return $line;
}

function dumbescape($in, $enclosure=false)
  {
  static $enc;
  if ($enclosure===false) {
    return str_replace($enc, '\\' . $enc, $in);
  }
  $enc=$enclosure;
}

$output = fopen('php://output', 'r+');
$rows_csv = mysql_query('SELECT * FROM  tblfeeder');

//Add file header
$fileheader = array( "FH", "READY TO PAY", $fileheader, $strOracleBatchName);
$line = dumbcsv($output, $fileheader, "\"", ",", "\r\n" );
fwrite($output, $line);

// loop over the rows, outputting them
while ($row_csv = mysql_fetch_assoc($rows_csv)) fwrite($output, dumbcsv($output,  $row_csv, "\"", ",", "\r\n" ));

//Add file footer
$filefooter = array( "IF", "xxx".$batchtotal."xxx", "xxx".$invnum."xxx");
$line = dumbcsv($output, $filefooter, "\"", ",", "\r\n" );
fwrite($output, $line);
于 2013-06-06T22:20:21.650 回答