PHP通用文件处理与格式转换引擎
文件格式转换是常见需求。PHP可以处理多种文件格式的转换。今天说说PHP中通用文件处理引擎的实现。
文件格式检测和读取是处理的第一步。
```php
interface FileReader
{
public function read(string $path): array;
public function supports(string $extension): bool;
}
interface FileWriter
{
public function write(string $path, array $data): void;
public function supports(string $extension): bool;
}
class CsvReader implements FileReader
{
public function read(string $path): array
{
$handle = fopen($path, 'r');
$headers = fgetcsv($handle);
$data = [];
while (($row = fgetcsv($handle)) !== false) {
$row = array_map(function ($value) {
$value = trim($value);
if (is_numeric($value)) return str_contains($value, '.') ? (float)$value : (int)$value;
return $value;
}, $row);
$data[] = $headers ? array_combine($headers, $row) : $row;
}
fclose($handle);
return $data;
}
public function supports(string $extension): bool
{
return in_array(strtolower($extension), ['csv', 'tsv']);
}
}
class JsonReader implements FileReader
{
public function read(string $path): array
{
$content = file_get_contents($path);
$data = json_decode($content, true);
if ($data === null) {
throw new \RuntimeException("JSON解析失败: " . json_last_error_msg());
}
return $data;
}
public function supports(string $extension): bool
{
return strtolower($extension) === 'json';
}
}
class XmlReader implements FileReader
{
public function read(string $path): array
{
$xml = simplexml_load_file($path);
$json = json_encode($xml);
return json_decode($json, true);
}
public function supports(string $extension): bool
{
return in_array(strtolower($extension), ['xml', 'xmls']);
}
}
class CsvWriter implements FileWriter
{
public function write(string $path, array $data): void
{
$handle = fopen($path, 'w');
if (!empty($data)) {
fputcsv($handle, array_keys($data[0]));
foreach ($data as $row) {
fputcsv($handle, $row);
}
}
fclose($handle);
}
public function supports(string $extension): bool
{
return strtolower($extension) === 'csv';
}
}
class JsonWriter implements FileWriter
{
public function write(string $path, array $data): void
{
file_put_contents($path, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
public function supports(string $extension): bool
{
return strtolower($extension) === 'json';
}
}
class FileConversionEngine
{
private array $readers = [];
private array $writers = [];
public function __construct()
{
$this->registerDefaultReaders();
$this->registerDefaultWriters();
}
public function registerReader(FileReader $reader): void
{
$this->readers[] = $reader;
}
public function registerWriter(FileWriter $writer): void
{
$this->writers[] = $writer;
}
public function convert(string $sourcePath, string $destPath): void
{
$sourceExt = pathinfo($sourcePath, PATHINFO_EXTENSION);
$destExt = pathinfo($destPath, PATHINFO_EXTENSION);
$reader = $this->findReader($sourceExt);
if ($reader === null) {
throw new \RuntimeException("不支持的源格式: {$sourceExt}");
}
$writer = $this->findWriter($destExt);
if ($writer === null) {
throw new \RuntimeException("不支持的目标格式: {$destExt}");
}
echo "正在读取: {$sourcePath}\n";
$data = $reader->read($sourcePath);
echo "正在写入: {$destPath}\n";
$writer->write($destPath, $data);
echo "转换完成\n";
}
public function getSupportedFormats(): array
{
$readFormats = [];
foreach ($this->readers as $reader) {
$readFormats[] = $reader;
}
return [
'readable' => $readFormats,
'writable' => $this->writers,
];
}
private function registerDefaultReaders(): void
{
$this->readers[] = new CsvReader();
$this->readers[] = new JsonReader();
$this->readers[] = new XmlReader();
}
private function registerDefaultWriters(): void
{
$this->writers[] = new CsvWriter();
$this->writers[] = new JsonWriter();
}
private function findReader(string $extension): ?FileReader
{
foreach ($this->readers as $reader) {
if ($reader->supports($extension)) return $reader;
}
return null;
}
private function findWriter(string $extension): ?FileWriter
{
foreach ($this->writers as $writer) {
if ($writer->supports($extension)) return $writer;
}
return null;
}
}
$engine = new FileConversionEngine();
$tempDir = '/tmp/conversion_test';
if (!is_dir($tempDir)) mkdir($tempDir, 0755, true);
$csvFile = "{$tempDir}/test.csv";
$fp = fopen($csvFile, 'w');
fputcsv($fp, ['name', 'age', 'email']);
fputcsv($fp, ['张三', 28, 'zhangsan@test.com']);
fputcsv($fp, ['李四', 35, 'lisi@test.com']);
fclose($fp);
try {
$engine->convert($csvFile, "{$tempDir}/output.json");
$engine->convert($csvFile, "{$tempDir}/output.xml");
$jsonData = json_decode(file_get_contents("{$tempDir}/output.json"), true);
print_r($jsonData);
} catch (\Exception $e) {
echo "错误: {$e->getMessage()}\n";
}
?>
文件转换引擎通过策略模式实现了格式的可扩展性。添加新的文件格式只需要注册对应的Reader和Writer类。这种设计让引擎可以处理多种文件格式的相互转换,包括CSV、JSON、XML等常见格式。
PHP通用文件处理与格式转换引擎
张小明
前端开发工程师
一键抓取微博并生成带情感色阶的中国地域热力图工具
本文还有配套的精品资源,点击获取 简介:直接运行爬取微博数据.py脚本,自动采集公开微博中的文本和用户填写的地理位置(如城市、省份),对每条微博做基础情感判断(正面/中性/负面)&…
iOS 用户福利:X 应用新增“视频回应”功能,多种录制风格可选!
X 应用“视频回应”:iOS 用户新玩法如今,iOS 用户在 X 应用中有了新体验。在 X 应用的转发符号下,用户能够选择“视频回应”功能,通过录制自己的视频来回应视频片段和静态图片,为交流互动增添了新的形式。满足多样化表…
靠谱的锅炉服务商
在供热与制冷领域,选择一家靠谱的锅炉服务商至关重要。它不仅关系到供暖效果、能耗成本,还涉及到使用体验和安全保障。今天,就让我们以北京中力创业机电设备有限公司(品牌卡吉斯)为例,来探讨如何挑选靠谱的…
为什么你买的学习机无法提分?揭秘AI诊断与“内容灌输”的本质差异
超过七成的家庭为孩子购买过学习设备,但使用率在三个月后大幅下降的行业数据,一直像一个顽固的标签,贴在传统教育电子产品上。当我们剥离掉学校和培训机构的外部辅导,让孩子独自面对家庭的预习与复习场景,一个核心痛点…
DLSS Swapper终极指南:3分钟学会游戏性能优化神器
DLSS Swapper终极指南:3分钟学会游戏性能优化神器 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经为了提升游戏帧率而苦恼?是否想在《赛博朋克2077》或《艾尔登法环》中获得更流畅的体…
医疗大模型轻量微调用中文临床数据包:含10+科室对话、NHS风格问答与多源JSON样本
本文还有配套的精品资源,点击获取 简介:专为医疗大语言模型LoRA/QLoRA微调准备的即用型中文数据集,覆盖外科、儿科、男科、肿瘤科等10余个临床科室,每科对应独立CSV文件(如surgical_外科.csv、pediatric_儿科.csv&a…