从php到csv

时间:2017-03-30 10:46:10

标签: php csv

我使用php生成这样的csv文件:

<?php 
function myfunction() {
    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename=filename.csv');

    $output = fopen('php://output', 'w');
    fputs( $output, "\xEF\xBB\xBF" );

    foreach (rows as $row) {
      $description=$this->FixDescription($row['Description']);
      $id = $row['id'];
      $myrow .= $id . ',' . $description ."\n";
}

      fputcsv($output, mb_convert_encoding($myrow, 'UCS-2LE', 'UTF-8'));
      fclose($output);
}
   public function FixDescription($descr){
    $d = html_entity_decode($descr, ENT_QUOTES, 'UTF-8');
    $d = htmlspecialchars_decode($d);
    $d = str_replace('&nbsp;', ' ', $d);
    $d = strip_tags($d);
    $d = str_replace('&','_',$d);
    return $d;
  }
?>

当我下载生成的文件时,我正确地获得了一些行但是对于某些行描述中断并留下空白行然后打印并且通常在我的csv文件中创建一个混乱。关于如何不破坏描述字段内容的任何想法?

3 个答案:

答案 0 :(得分:1)

你应该替换

//title[text()="Keywords"]/body/p/text()

$myrow .= $id . ',' . $description ."\n";

你不再需要这些行了

fputcsv($output, array($id,$description);

答案 1 :(得分:0)

替换:

foreach (rows as $row) {
    $description=$this->FixDescription($row['Description']);
    $id = $row['id'];
    $myrow .= $id . ',' . $description ."\n";
}

fputcsv($output, mb_convert_encoding($myrow, 'UCS-2LE', 'UTF-8'));

foreach (rows as $row) {
    $description = $this->FixDescription($row['Description']);
    $description = mb_convert_encoding($description, 'UCS-2LE', 'UTF-8');
    $id = $row['id'];
    $myrow = [$id, $description];
    fputcsv($output, $myrow);
}

答案 2 :(得分:0)

在我的FixDescription函数中,在返回之前添加了以下行:

$d = preg_replace('/\r\n/','',$d);

这样就可以替换ENTER并将描述放在一行