【问题标题】:Output to CSV with ' " ' enclosures输出到带有 '"' 附件的 CSV
【发布时间】:2023-03-28 02:14:01
【问题描述】:

我想将查询输出到一个 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添加附件?

【问题讨论】:

标签: php csv


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个要导入 Oracle 的馈送文件(它非常具体地说明了它期望在哪些字段周围加上引号)。我想在这种情况下它不是真正的 csv 文件,但还有其他选择吗?
【解决方案2】:

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

$fileheader = array( "FH", "READY TO PAY", "RTP060620134", "060620134RWKN", "");
for($i=0; $i<count($fileheader); $i++) 
{ 
    $fileheader[i] = '"' . $fileheader[$i] . '"'; 
}
fputcsv($output, $fileheader, ",", '');

【讨论】:

    【解决方案3】:

    感谢大家的帮助。我使用了多个答案的组合,因为我需要能够选择要包含哪些字段以及不包含哪些字段。在将行写入文件之前,我在不想包含的字段周围添加了一个唯一字符串 (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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2014-02-26
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多