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);
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#数据筛选
|
|||
|
#串口助手
|