最近在处理一个数据导入导出项目时,我遇到了一个令人头疼的问题:需要处理的CSV文件动辄数GB,包含数十万甚至上百万条记录。尝试使用PHP内置的
fgetcsv
就在我几乎要放弃,考虑其他语言解决方案的时候,我发现了
Goodby CSV
使用 Composer 引入
Goodby CSV
<pre class="brush:php;toolbar:false;">composer require goodby/csv
Composer 会自动为你下载并安装
goodby/csv
Goodby CSV
面对大型CSV文件,
Goodby CSV
Lexer
Interpreter
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
// 假设你的CSV文件名为 data.csv
// 内容示例:
// id,name,email
// 1,张三,zhangsan@example.com
// 2,李四,lisi@example.com
$config = new LexerConfig();
// 配置CSV文件的编码,例如从SJIS-win转换为UTF-8
$config->setFromCharset('SJIS-win')->setToCharset('UTF-8');
// 如果你的CSV使用制表符作为分隔符,可以这样设置
// $config->setDelimiter("\t");
// 如果你的CSV字段用单引号包围
// $config->setEnclosure("'");
$lexer = new Lexer($config);
$interpreter = new Interpreter();
// 添加一个观察者(回调函数),每读取一行数据就会触发
$interpreter->addObserver(function(array $row) {
// $row 数组包含了当前行的所有列数据
// 在这里你可以将数据插入数据库,或者进行其他业务处理
echo "处理行: " . implode(', ', $row) . PHP_EOL;
// 示例:将数据插入到数据库
// $stmt = $pdo->prepare('INSERT INTO users (id, name, email) VALUES (?, ?, ?)');
// $stmt->execute($row);
});
try {
// 开始解析CSV文件
$lexer->parse('data.csv', $interpreter);
echo "CSV文件导入完成!" . PHP_EOL;
} catch (\Exception $e) {
echo "导入失败: " . $e->getMessage() . PHP_EOL;
}
?>通过这种方式,无论你的CSV文件有多大,
Goodby CSV
导出数据同样简单高效,你可以从数组、数据库查询结果甚至自定义集合中导出数据。
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
use Goodby\CSV\Export\Standard\Collection\PdoCollection; // 如果从PDO导出
// 导出配置
$config = new ExporterConfig();
// 设置导出文件的编码为SJIS-win,源数据为UTF-8
$config->setFromCharset('UTF-8')->setToCharset('SJIS-win');
// $config->setDelimiter("\t"); // 同样可以自定义分隔符
$exporter = new Exporter($config);
// 示例1: 从数组导出数据
$dataToExport = [
['ID', '姓名', '邮箱'], // 表头
[1, '张三', 'zhangsan@example.com'],
[2, '李四', 'lisi@example.com'],
];
// 导出到标准输出(浏览器下载或命令行显示)
echo "--- 从数组导出到标准输出 ---" . PHP_EOL;
$exporter->export('php://output', $dataToExport);
// 导出到文件
echo "--- 从数组导出到文件 (output.csv) ---" . PHP_EOL;
$exporter->export('output.csv', $dataToExport);
// 示例2: 从数据库查询结果导出 (需要PDO连接)
// $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
// $stmt = $pdo->prepare("SELECT id, name, email FROM users");
// $stmt->execute();
// echo "--- 从数据库导出到文件 (db_output.csv) ---" . PHP_EOL;
// $exporter->export('db_output.csv', new PdoCollection($stmt));
?>Goodby CSV
setFromCharset
setToCharset
Interpreter::unstrict()
Goodby CSV
通过引入
Goodby CSV
如果你也正被PHP处理大型CSV文件的性能和内存问题所困扰,那么
Goodby CSV
以上就是解决大型CSV文件导入导出难题:GoodbyCSV助你高效处理数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号