78 lines
1.9 KiB
Markdown
78 lines
1.9 KiB
Markdown
---
|
||
title: 数据交错处理
|
||
updated: 2022-03-15 10:10:49Z
|
||
created: 2022-03-14 07:44:29Z
|
||
tags:
|
||
- 串口助手
|
||
- 数据筛选
|
||
---
|
||
|
||
自制串口助手中有一需求,从接收字符串中提取帧数据,提炼后即为
|
||
“将一字符串按指定的数组进行分割,先到优先”
|
||
# 算法实现
|
||
分为几个部分
|
||
## 算法思路如下:
|
||
1. 遍历字符串,查找没个数组元素在字符串中的位置i、j,保存的到数组idx
|
||
2. 若idx不为空,则对idx进行i元素升序排序
|
||
3. 此时可能存在交错现象(主要原因是数组元素有交错现象),特征是前一组数据的j不小于后一组的i,“先到原则”即剔除后一组数据直到所有数据不存在交错。方法有一是遍历数组,发现交错数据就立即清除(数组大小随之-1),直到无交错再进行下一轮循环,有些复杂。也可利用push操作,符合才push,不符合直接丢弃。
|
||
4.剔除交错后,按i,j-1分割原字符串即可
|
||
## 源码
|
||
测试代码如下:
|
||
```js
|
||
import console;
|
||
|
||
findEx = function(str,p,mode=0){
|
||
if(t and type(p) == type.string){
|
||
t= ..string.split(p,"|")
|
||
}
|
||
|
||
var idx = {};
|
||
for(k,v in p){
|
||
for i,j in ..string.gfind(str,v) {
|
||
..table.push(idx,{i;j})
|
||
}
|
||
}
|
||
|
||
table.sort(idx,function(v){//按第一元素升序排序
|
||
for(i=1;#owner;1){
|
||
if(owner[i] != v[i]){
|
||
return owner[i] < v[i];
|
||
}
|
||
}
|
||
})
|
||
|
||
if(mode){
|
||
var rst = {idx[1]};
|
||
for(i=2;#idx;1){
|
||
if(idx[i][1] > rst[#rst][2]){
|
||
table.push(rst,idx[i])
|
||
}
|
||
}
|
||
idx = rst;
|
||
}
|
||
|
||
return idx;
|
||
|
||
}
|
||
|
||
sets = {"fre"={"频率";"MHz"};"amp"={"幅度";"dBm"};"vol"={"电压";"V"};"emp"={"温度";"℃"}}
|
||
str = "456ampfre=12213devvol=45temp=?45fre123amp=45646vol4545temp=45645mpfremp=12213vol45temp=?45fre1" ;
|
||
var new = {};
|
||
table.map(sets,lambda(v,k) table.push(new,k) )
|
||
|
||
var tmp = findEx(str,new)
|
||
console.dump(tmp)
|
||
console.pause(true);
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#数据筛选
|
||
#串口助手 |