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