obsidian-notes/代码/数据交错处理.md
CSSC-WORK\murmur 3e6078442b init version
2024-04-15 11:19:57 +08:00

1.9 KiB
Raw Permalink Blame History

title updated created tags
数据交错处理 2022-03-15 10:10:49Z 2022-03-14 07:44:29Z
串口助手
数据筛选

自制串口助手中有一需求,从接收字符串中提取帧数据,提炼后即为 “将一字符串按指定的数组进行分割,先到优先”

算法实现

分为几个部分

算法思路如下:

  1. 遍历字符串查找没个数组元素在字符串中的位置i、j保存的到数组idx
  2. 若idx不为空则对idx进行i元素升序排序
  3. 此时可能存在交错现象主要原因是数组元素有交错现象特征是前一组数据的j不小于后一组的i“先到原则”即剔除后一组数据直到所有数据不存在交错。方法有一是遍历数组发现交错数据就立即清除数组大小随之-1直到无交错再进行下一轮循环有些复杂。也可利用push操作符合才push不符合直接丢弃。 4.剔除交错后按ij-1分割原字符串即可

源码

测试代码如下:

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);

#数据筛选 #串口助手