OCR 结果整理成表格
它解决什么问题
截图识别出来的是一堆散落的文字块,顺序是识别引擎给的,不是你看的顺序。直接存下来是一坨,没法用。
这条配方把它整理成「一行一条、从上到下」的结构,再用正则挑出你要的字段,最后存成能直接粘进表格的文件。
先理解 OCR 输出是什么
「OCR 识别节点」的输出是两个对象:
| 输出口 | 内容 |
|---|---|
ocrResult |
识别结果对象,含每个文字块的内容和置信度 |
screenOcrResult |
同上,但坐标已换算成屏幕坐标 |
注意它是对象,不是纯文本。 想拿字符串,有两个办法:
- 接「整理文本节点」—— 它接受文字列表,按阅读顺序重新排
- 接「JSON 取值节点」——
json接结果对象,path填你要的字段
先从简单的走:OCR → 整理文本。
分步做
1. 截图,把图交给 OCR
截图节点 captureMode 设 bitmap(不落盘,直接给下游),输出接 OCR 节点的 bitmap。
要识别手机里已有的图,就用 OCR 节点的 imagePath(单张)或 folderPath(一批)。
2. OCR 节点:只认你需要的区域
| 参数 | 填什么 | 为什么 |
|---|---|---|
识别区域 recognizeRegion |
区域模式,框住表格那部分 | 全屏会把状态栏、导航栏、广告一起认进来 |
语言 language |
中文 / 英文 / 混合 | 选错会认成乱码 |
区域限定这一步能省掉后面一半的清洗工作。宁可多框几次,也别全屏硬认。
3. 整理文本:把散块排成行
加「整理文本节点」,outputMode 填 sequential_all(按顺序全部输出,用换行连接)。
关键参数是 yGroupThreshold(Y 轴分组阈值):同一行里的文字块,纵向差多少像素以内算同一行。
- 表格行高比较大 → 调大,比如
30 - 行贴得紧 → 调小,比如
10 - 设成
0→ 每块单独一行,表格行会被拆散
4. 正则提取:只要你要的那一列
加「正则提取节点」:
| 参数 | 填什么 |
|---|---|
输入 input |
接整理文本的输出 |
正则 pattern |
捕获你要的部分,比如 (\d+\.\d+) 抓金额 |
分组 group |
1(第 1 个括号里的内容) |
全部匹配 outputAll |
true —— 只取第一条就设 false |
outputAll 开着的意义:一屏里通常有多行,只取第一条等于只拿了一行。
5. 存成能粘进表格的格式
「写文件节点」:
| 参数 | 填什么 |
|---|---|
路径 path |
比如 识别结果.csv |
内容 content |
接正则提取的输出 |
追加 append |
true |
存成 .csv 扩展名,Excel / WPS / 腾讯文档都能直接打开。
分隔符是逗号 —— 如果抓出来的是多行多列,要在正则里就把每行的字段用逗号连好,比如 (\S+),(\d+) 配替换模板 $1,$2。否则整行会挤在一个单元格里。
用到的节点
| 节点 | 干什么 |
|---|---|
| 截图节点 | bitmap 模式,把图交给 OCR |
| OCR 识别节点 | 限定区域、选语言,输出结果对象 |
| 整理文本节点 | 按 Y 轴分组把散块排成行 |
| 正则提取节点 | 挑出目标字段,outputAll 拿全部 |
| 写文件节点 | 追加写入 csv |
| JSON 取值节点 | 要从结果对象里取特定字段时用 |
容易踩的坑
- 全屏识别是最大的坑。 状态栏的时间、电量、信号都会被认进来,混在数据里还不容易发现。
yGroupThreshold设错会串行。 太小 → 一行被拆成三行;太大 → 相邻两行被并成一行。- 正则里用了中文全角括号。 正则引擎只认半角
(),全角(会被当成普通字符。 append没开。 最后一屏覆盖前面的,只得到最后一页的数据。- OCR 不是百分之百准。 数字 0 和字母 O、1 和 l 经常混。要精确数据的话,识别完人工核一遍,别直接当账目用。