跳转到主内容
极星编程网:以代码为星,赴技术山海!

PHP怎么处理CSV文件_PHP读写CSV数据格式方法【方法】

fgetcsv读中文乱码需检测BOM并跳过,用stream_filter_append做流式转码;fputcsv写入需先写UTF-8 BOM()且用wb模式;大文件须流式处理、分批提交;解析时须显式指定分隔符、封装符等参数。 fgetcsv 读取 CSV 时中文乱码怎么办 PHP 原生
fgetcsv
默认按字节读取,不识别 UTF-8 BOM 或编码声明,遇到含中文的 CSV 文件,
fgetcsv
返回的数组字段常是乱码或截断。 根本原因是:CSV 文件本身是 UTF-8 编码(可能带 BOM),但 PHP 流没做编码转换,
fgetcsv
把多字节 UTF-8 字符当单字节切分了。 先用
file_get_contents
读取文件头 3 字节,判断是否含 UTF-8 BOM(

),有则跳过 用
fopen
打开时指定
rb
模式,避免 Windows 下自动换行转换干扰 读取后对每行用
mb_convert_encoding($line, 'UTF-8', 'GBK')
转码(若源文件实为 GBK)——别硬猜,先用
mb_detect_encoding($line)
验证 更稳妥的做法:用
stream_filter_append($fp, 'convert.iconv.GBK/UTF-8')
在流层面过滤,比逐行转更快也更干净 fputcsv 写入中文 CSV 打不开 Excel 怎么办 用
fputcsv
直接写 UTF-8 中文,Excel(尤其是 Windows 版)打开会显示乱码,不是 PHP 问题,是 Excel 默认用系统 ANSI 编码(如 GBK)解析文件。 必须让 Excel 知道这是 UTF-8,并带 BOM 标识。BOM 不是可选装饰,是 Windows Excel 解析 UTF-8 的唯一可靠信号。 立即学习 “ PHP免费学习笔记(深入) ”; 写入前先向文件句柄写入

(UTF-8 BOM),再调用
fputcsv
确保
fopen
用
wb
模式,避免文本模式下自动替换
为
导致 BOM 错位 不要用
mb_convert_encoding($str, 'UTF-8', 'UTF-8')
多此一举——已为 UTF-8 却再转,可能引入空字符 如果数据含 Excel 特殊字符(如
=
、
+
开头),
fputcsv
默认不加引号,Excel 会误解析为公式;需手动设置第四个参数
$enclosure = '"'
并确保
$escape_char = '\'
大 CSV 文件内存爆掉,怎么边读边处理 用
file()
或
file_get_contents()
一次性加载几 MB 以上 CSV,PHP 进程直接 OOM。真实场景中,10 万行 CSV 就可能超 50MB。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载
fgetcsv
本就是流式读取,关键在别自己缓存整张表。 用
fopen
+
fgetcsv
循环,每读一行就处理一行(入库、校验、写日志),处理完 unset 行数组 避免在循环里拼接字符串累积结果,比如
$all .= $row[0]
—— PHP 字符串复制开销极大 若需批量插入数据库,每 500 行 commit 一次事务,而不是每行都
INSERT
;用
PDO::prepare
+
execute
复用语句,别拼 SQL 注意
fgetcsv
第二个参数
$length
必须设足够大(如
4096
),否则长字段被截断且不报错 CSV 字段含换行符、逗号、引号怎么安全解析 标准 CSV 允许字段用双引号包裹,内部双引号要写成两个(
"a""b"
),换行符也可出现在引号内。但很多手写 CSV 或导出工具不严格遵循 RFC 4180,导致
fgetcsv
解析失败或错位。
fgetcsv
实际上支持这些规则,但前提是你的分隔符、封装符、转义符配置和文件一致。 确认源文件实际使用的分隔符:可能是
;
(欧洲常用)或
(TSV),别默认用 comma 调用
fgetcsv($fp, 0, ';', '"', '"')
显式传入分隔符、封装符、转义符,别依赖默认值 若字段里混用了半角/全角逗号、引号,
fgetcsv
无能为力,得先预处理:用正则把全角符号替换成半角,或改用
str_getcsv
配合自定义逻辑 遇到解析返回
false
,别直接跳过,用
ftell($fp)
记录当前偏移,人工查该位置附近原始内容,往往发现是某行少了一个引号 CSV 看似简单,但编码、BOM、流模式、字段边界这四点只要漏一个,就卡住半天。尤其别信“文件明明是 UTF-8,为什么还乱码”这种直觉——先用
hexdump -C file.csv | head
看前 10 字节,比猜快十倍。

相关文章