
本文介绍如何将 cURL 请求返回的以 | 分隔、含查询头和表头的文本表格数据,通过 PHP 脚本高效清洗并转换为标准 JSON 数组,支持字段自动映射与空行容错。
本文介绍如何将 curl 请求返回的以 `|` 分隔、含查询头和表头的文本表格数据,通过 php 脚本高效清洗并转换为标准 json 数组,支持字段自动映射与空行容错。
在实际开发中,我们常通过 cURL 向数据库查询服务(如 RESTful SQL 接口)提交查询,但响应往往以人类可读的表格形式返回——首行为原始 SQL 语句,次行为字段名(用 `|` 分隔),后续为数据行。这种格式虽便于调试,却无法直接被前端或下游服务消费。本文提供一个健壮、可复用的 PHP 解析方案,将此类输出精准转换为符合 RFC 8259 的 JSON 数组。
核心处理逻辑分为四步:
-
按行分割:使用
explode("\n", $raw)将原始响应切分为行数组; -
跳过元信息:
array_shift()移除首行(SQL 查询语句); -
提取字段名:对第二行调用
explode('|', ...)并配合array_map('trim', ...)清理首尾空格,得到键名数组; -
逐行构建对象:遍历剩余数据行,每行同样按
|拆分、trim 后,用array_combine($fieldnames, $values)映射为关联数组,最终json_encode(..., JSON_PRETTY_PRINT)输出格式化 JSON。
以下是完整可运行示例(兼容 PHP 7.4+):
<?php // 模拟 cURL 响应(实际中替换为 shell_exec("curl -d '...' -X POST https://..."))
$rawOutput = <<<'EOT'
> select ID, HEIGHT, COIN_BALANCE from account order by balance desc limit 20
ID | HEIGHT | COIN_BALANCE
-7700097703553861699 | 1815934 | 299014795
-354651164223319404 | 1789433 | 150010434
514812057486191450 | 1815934 | 150000409
2819400133805325807 | 1789617 | 150000289
2045072049257519302 | 0 | 150000000
2825154884517497903 | 0 | 17904059
EOT;
// 【关键处理】
$lines = array_filter(array_map('trim', explode("\n", $rawOutput)), 'strlen'); // 过滤空行
if (count($lines) ' 开头)
$headers = array_map('trim', explode('|', array_shift($lines))); // 提取并清理字段名
$result = [];
foreach ($lines as $line) {
if (empty(trim($line))) continue;
$cells = array_map('trim', explode('|', $line));
// 安全校验:确保字段数匹配,避免 array_combine 报错
if (count($cells) !== count($headers)) {
error_log("Warning: Row field count mismatch (expected " . count($headers) . ", got " . count($cells) . ") — skipping: {$line}");
continue;
}
$result[] = array_combine($headers, $cells);
}
// 输出标准 JSON(生产环境建议移除 JSON_PRETTY_PRINT 以减小体积)
header('Content-Type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
⚠️ 注意事项:
利用农业相机拍摄植物叶片高分辨率图像,通过AI视觉技术检测叶片卷曲方向(向上卷曲或向下卷曲)
- 若需在 Shell 中直接处理,可组合
curl | sed '1d' | sed '1d' | awk -F'|' '{print $1,$2,$3}' | jq等命令,但 PHP 方案更易维护、容错性强; - 实际调用时,务必对
shell_exec()或proc_open()的 cURL 结果做escapeshellarg()防注入,并设置超时与错误处理; - 字段名含空格或特殊字符时,服务端应确保其在
|分隔中保持一致性(本方案依赖严格分隔); - 如需类型转换(如
"HEIGHT": "1815934"→"HEIGHT": 1815934),可在array_combine后添加filter_var($val, FILTER_VALIDATE_INT)等逻辑。
该方法已在高并发日志分析与数据库代理服务中稳定使用,兼顾简洁性与鲁棒性,是处理类 CLI 表格响应的推荐实践。










