PHP 导出CSV文件部分行错位

使用PHP fputcsv 或者 fwrite 方法导出大概1万7千条数据,出现大概6条到10条左右的数据错位情况。

代码:

public static function createCsv($data, $header = [], $filename = '')
{
    // 参数判断
    $data = is_object($data) ? $data->toArray() : $data;
    $header = is_array($header) ? $header : [];
    $filename = (1 > strlen(trim($filename))) ? 'csv-' : trim($filename);
    if (empty($data)) {
        return false;
    }

    // 文件名/目录
    $filename = $filename . date("YmdHis", time()) . rand(1000, 9999) . ".csv";
    $dir = \Env::get('runtime_path') . '/export/';
    if (!is_dir($dir) && !mkdir($dir)) {
        return false;
    }

    // 打开文件指针资源
    $handle = fopen($dir . $filename, 'w+');
    if (!$handle) {
        return false;
    }

    // 写入文件header头
    if (!empty($header)) {
        $res = fputcsv($handle, $header);
        if (!$res) {
            return false;
        }
    }

    // 判断header是索引数组还是关联数组
    $is_assoc = array_keys($header) !== range(0, count($header) - 1);

    // 写入文件内容
    $frequency = 0; // 频率
    $limit = 100000;
    foreach ($data as $datum) {
        $frequency++;
        if ($limit == $frequency) {
            // 刷新输出buffer
            ob_flush();
            flush();
            $frequency = 0;
        }
        // 如果是关联数组,则获取内容中和头部key相对应的值
        if ($is_assoc) {
            $csv = "";
            foreach(array_keys($header) as $item) {
                $val = str_replace('"', '""', "\t" . $datum[$item]);
                $csv .= '"' . $val . '",';
            }
            $csv = substr($csv, 0, -1);
            $csv .= "\n";
            $res = @fwrite($handle, $csv);
        } else {
            $res = fputcsv($handle, $datum);
        }

        if (!$res) {
            return false;
        }
    }

    // 关闭指针资源
    fclose($handle);
    return \Url::build('erp/Common/export', 'file=' . $filename);
}

出现的情况:

https://img4.mukewang.com/5c8f4bfb0001a56908000113.jpg

同样的数据筛选之后发现也只有这一条出现问题

https://img.mukewang.com/5c8f4bfd000105ae08000077.jpg

源码:

https://img3.mukewang.com/5c8f4bfe0001d53f08000047.jpg

发现该行的逗号分隔符去到双引号里了,请问出现这种问题的原因是什么。

jeck猫
浏览 713回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP