【问题标题】:fputcsv ignore newline from databasefputcsv 忽略数据库中的换行符
【发布时间】:2020-09-16 10:15:14
【问题描述】:

所以我使用 Laravel 将数据库查询生成到 csv 中,如下所示:

public function downloadVoucher(Request $req)
    {
        header('Content-Type: text/csv; charset=utf-8');  
        header('Content-Disposition: attachment; filename=data.csv');  
        if ($req->start == "") {
            $req->start = "2000-01-01";
        } else if ($req->end == "") {
            $req->end = "3000-31-12";
        }
        $output = fopen("php://output", "w");
                fputcsv($output, array('No', 'Nama', 'Email', 'No Hp', 'Tanggal Redeem Voucher',
                'Kode Voucher','Progress Study','Quiz Score','Date Download Certificate','Download Certificate', 
                'Sudah Jualan Online?', 'Deskripsi Produk', 'Instagram Toko Online', 'Marketplace Toko Online', 
                'Website Toko Online'));  
        $data = VoucherBitX::select('quiz_score.score','quiz_score.status','voucher_bit_x.track_id',
                'voucher_bit_x.user_id','voucher_bit_x.redeem_at','voucher_bit_x.voucher_code','users.phone',
                'users.ref_id','users.email','users.name','certificate.published', 'users.is_online_selling', 
                'users.selling_desc', 'users.instagram_selling_acc', 'users.marketplace_acc', 'users.online_selling_website')
        ->where("voucher_bit_x.status",0)
        ->whereDate("voucher_bit_x.redeem_at", ">=", $req->start)
        ->whereDate("voucher_bit_x.redeem_at", "<=", $req->end)
        ->leftJoin('users','users.id','=','voucher_bit_x.user_id')
        ->leftJoin("certificate",function($join){

            $join->on("certificate.user_id","=","voucher_bit_x.user_id")
    
                ->on("certificate.track_id","=","voucher_bit_x.track_id");
    
        })
        ->leftJoin("quiz_score",function($join){

            $join->on("quiz_score.user_id","=","voucher_bit_x.user_id")
    
                ->on("quiz_score.track_id","=","voucher_bit_x.track_id");
    
        })
        ->orderBy("voucher_bit_x.redeem_at","DESC")
        ->get();
        $no = 0;
        foreach ($data as $key => $value) {
            $no = $no+1;
            $urlQr = "";
            $solve = Track::userProgress($value->user_id,$value->track_id);
            $solve .="%";
            if(!empty($value->status)){
                $track = Track::find($value->track_id);
                $urlQr = 'https://connect.xxxx.id/api/certificate/'.base64_encode(json_encode(["user_id"=>$value->user_id,"slug"=>$track->slug,"track_id"=>$track->id]));
            }
            $redeem_at = $value->redeem_at;
            fputcsv($output, array($no,$value->name,$value->email,$value->phone, $redeem_at,
            $value->voucher_code,$solve,isset($value->score)?$value->score:0,$value->published, $urlQr,
            ($value->is_online_selling == 1 ? 'Sudah' : 'Belum'), $value->selling_desc, 
            $value->instagram_selling_acc,$value->marketplace_acc, $value->online_selling_website));  
        }  
        fclose($output);  
    }

问题是,当一个字段中的数据包含换行符(输入)时,它会变成 csv 上的新行,这是一个误导性数据,它必须是一条记录($value-> sell_desc 字段之一)。我如何克服这个问题?我关注了this,但它似乎与我的问题不符。有什么建议吗?

【问题讨论】:

    标签: php laravel csv


    【解决方案1】:

    实际上,CSV 标准允许在引号内换行。

    在读取文件时,fgetcsv可以正确处理。

    作为一种解决方法,您可以从项目中删除换行符(例如用空格替换它们):

            ...
            $data = array($no,$value->name,$value->email,$value->phone, $redeem_at,
                $value->voucher_code,$solve,isset($value->score)?$value->score:0,$value->published, $urlQr,
                ($value->is_online_selling == 1 ? 'Sudah' : 'Belum'), $value->selling_desc, 
                $value->instagram_selling_acc,$value->marketplace_acc, $value->online_selling_website
            );
    
            foreach ($data as $k => $v) { 
                $data[$k] = preg_replace('/[\r\n]/', ' ', $v); // replace newlines by spaces
            }
    
            fputcsv($output, $data);  
            ...
    

    【讨论】:

    • 哇,这真的很管用!无论如何,我只需要preg_replace('/[\r\n]/', ' ', $value-&gt;selling_desc); 部分。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多