【问题标题】:PhP export .csv change delimiter from comma to othersPhP 导出 .csv 将分隔符从逗号更改为其他分隔符
【发布时间】:2016-03-13 21:44:29
【问题描述】:

我有这个 PhP 代码,用户点击一个按钮,它会自动下载一个 .csv 文件,其中包含不同类型的信息。所以这个 .csv 文件是用逗号分隔的,所以这意味着只要有逗号,指针就会转到下一个单元格。但我想将分隔符更改为逗号以外的任何内容,因为我的一些数据有逗号,例如位置列有数据,如 501A、501B,它需要位于单个单元格上。但相反,它转到另一个单元格,所以当我以纵向打印时,id 不适合。所以我只想问如何更改分隔符并用逗号维护数据?谢谢!

<?php
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "envoy");
function db_connect() {

  $db = mysqli_connect(DB_HOST, DB_USER, DB_PASS) or die("ERROR!");
  mysqli_select_db($db, DB_NAME);

  return $db;
}

$db = db_connect();
date_default_timezone_set("EST5EDT");
$date = date('m-d-Y,h.i.sa');
$date2 = date('m/d/Y');
$filename = $date.'.csv';
//$fp = fopen($filename,"w");

$sql2 = "SELECT sku as Sku,name as 'Brochure Name',location as Location FROM brochureinfo where modified LIKE '$date2' ORDER BY name  ";
$rs2 = mysqli_query($db, $sql2);
$total_records = mysqli_num_rows($rs2);
mysqli_close($db);

if($total_records>0){
$row = mysqli_fetch_assoc($rs2);

$seperator = "";
$comma = "";

foreach ($row as $name => $value){
    $seperator.= $comma. ''.str_replace('','""',$name);
    $comma=",";

}
$seperator .= "\n";

//echo $seperator;




mysqli_data_seek($rs2,0);

while ($row = mysqli_fetch_assoc($rs2)){


//$seperator = "";
$comma = "";

foreach ($row as $name => $value){

            $value = str_replace( array( "\r" , "\n", "\r\n", "\n\r" ) ,'' , $value);
            $value = str_replace('</b><br>','',$value);
            $value = str_replace('<b>','',$value);
            $value = str_replace('<br>','',$value);
            $value = str_replace('<br />','',$value);

    $seperator.= $comma. ''.str_replace('','""',$value);
    $comma=",";

    }
$seperator .= "\n";
}

header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename=$date.csv");
header('Pragma: no-cache');

echo $seperator;
}
else{
    header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename=$date.csv");
header('Pragma: no-cache');
echo "No record modified today";}

【问题讨论】:

    标签: php csv


    【解决方案1】:

    使用 PHP 函数 fputcsv 将每一行作为一个数组(其中每一列的值将是数组中的一项),所以你不必担心里面的逗号。由于您是直接下载文件,因此请使用 PHP 输出作为文件句柄。请记住在输出开始之前设置标题。

    $output = fopen('php://output', 'w');
    
    // output the column headings/ values
    fputcsv($output, array('Column 1', 'Column 2', 'Column 3');
    

    【讨论】:

      【解决方案2】:

      您可以使用fputcsv()生成csv格式的数据

      int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' [, string $escape_char = "\" ]]] )
      

      编辑:

      您的代码将如下所示:

      <?php
      define("DB_HOST", "localhost");
      define("DB_USER", "root");
      define("DB_PASS", "");
      define("DB_NAME", "envoy");
      function db_connect() {
      
        $db = mysqli_connect(DB_HOST, DB_USER, DB_PASS) or die("ERROR!");
        mysqli_select_db($db, DB_NAME);
      
        return $db;
      }
      
      $db = db_connect();
      date_default_timezone_set("EST5EDT");
      $date = date('m-d-Y,h.i.sa');
      $date2 = date('m/d/Y');
      $filename = $date.'.csv';
      $fp = fopen($filename,"w");
      
      $sql2 = "SELECT sku as Sku,name as 'Brochure Name',location as Location FROM brochureinfo where modified LIKE '$date2' ORDER BY name  ";
      $rs2 = mysqli_query($db, $sql2);
      $total_records = mysqli_num_rows($rs2);
      mysqli_close($db);
      
      if ($total_records>0) {
          $row = mysqli_fetch_assoc($rs2);
      
          $delimiter = ';';
          $data = [];
          foreach ($row as $name => $value){
              $data[] = $name;
          }
          fputcsv($fp, $data, $delimiter);
      
      
          mysqli_data_seek($rs2,0);
      
          while ($row = mysqli_fetch_assoc($rs2)){
              fputcsv($fp, $row, $delimiter);
          }
      
          fclose($fp);
      
          header('Content-Type: text/csv');
          header("Content-Disposition: attachment; filename=$date.csv");
          header('Pragma: no-cache');
      
          echo $seperator;
      }
      else {
          fclose($fp);
      
          header('Content-Type: text/csv');
          header("Content-Disposition: attachment; filename=$date.csv");
          header('Pragma: no-cache');
          echo "No record modified today";
      }
      

      【讨论】:

      • 那么我要替换哪一个?抱歉这个愚蠢的问题
      • 谢谢,但我不能使用 fopen();因为它在我的 .php 文件的文件夹中创建了一个文件。但我用 fopen 试过了,现在删除 $seperator 什么都不显示。
      • 您可以使用临时目录。使用tmpfile() 而不是fopen()php.net/manual/en/function.tmpfile.php
      • 感谢您的回复!但为什么它什么都没有? :(再次感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 2018-06-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多