使用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);
}
出现的情况:
同样的数据筛选之后发现也只有这一条出现问题
源码:
发现该行的逗号分隔符去到双引号里了,请问出现这种问题的原因是什么。
1 回答
- 1 回答
- 0 关注
- 712 浏览
添加回答
举报
0/150
提交
取消