如何解析银行App导出的格式异常的逗号分隔文件?
可靠解析异常格式银行CSV文件的方法
问题分析
你遇到的CSV文件存在多种格式异常:
- 整行被外层双引号包裹
- 字段值用成对双引号(
""abc"")表示实际带引号的内容 - 行尾分号数量随机,部分行无分号
- 部分字段内部包含分号等特殊字符
解决方案
以下是通用且可靠的解析代码,能适配所有异常情况:
// 打开目标CSV文件 $file = fopen('bank_transactions.csv', 'r'); if (!$file) { die('无法打开CSV文件'); } // 编码转换工具函数 function convertToUtf8($content) { return mb_convert_encoding($content, "UTF-8", "ISO-8859-2"); } while (($rawLine = fgets($file)) !== false) { $line = trim($rawLine); if (empty($line)) continue; // 1. 移除整行首尾的外层双引号 $line = preg_replace('/^"|"$/', '', $line); // 2. 清理行尾所有冗余分号(不管数量多少) $line = rtrim($line, ';'); // 3. 修复字段内的双引号转义:将""替换为" $line = str_replace('""', '"', $line); // 转码并解析CSV字段 $parsedFields = str_getcsv(convertToUtf8($line), ','); // 此处可添加自定义业务逻辑,比如存储到数据库或输出 print_r($parsedFields); } fclose($file);
代码说明
- 首尾双引号处理:用正则表达式精准匹配并移除整行最外层的双引号,不影响字段内部的引号
- 行尾分号清理:
rtrim直接去除行尾所有分号,兼容有/无分号、分号数量随机的情况 - 引号转义修复:统一将
""替换为",还原字段内的原始引号内容 - 原生CSV解析:使用PHP内置的
str_getcsv函数,确保含逗号、引号等特殊字符的字段能被正确拆分
内容的提问来源于stack exchange,提问作者Kida
相关产品推荐
相关产品推荐

