完整编写一个TXT解析器的过程 parser 对照需求和功能实现处理
2018-03-01 10:51
375 查看
一 修改说明:需求一:一开始说要解析UECapabilityInfo 消息里的supportedBandCombination-r10这个IE里的CA组合转化成易阅读的表现形式. 我以为一组CA组合就是一组:bandEUTRA-r10
ca-BandwidthClassUL-r10
ca-BandwidthClassDL-r10
supportedMIMO-CapabilityDL-r10
功能实现:
有效信息筛选:于是就用循环把UECapabilityInformation的数据里每一行作为一个元素放到list里面
然后用bandEUTRA-r10作为一组CA的识别信息、在筛选出同组ca-BandwidthClassUL-r10、ca-BandwidthClassDL-r10、supportedMIMO-CapabilityDL-r10的信息,添加保存到字符串中,然后再把字符串作为元素添加到list中去。最后遍历list的元素写入目标文件
需求二:
然后收到反馈CA组合的理解是错误的。一组CA组合应该是以大括号作为识别的,里面可能包含多组:
bandEUTRA-r10:
ca-BandwidthClassUL-r10
ca-BandwidthClassDL-r10
supportedMIMO-CapabilityDL-r10
CA组合识别原理:在查看UECapabilityInformation内的CA组合后 发现CA组合内第一个 bandEUTRA-r10因为比其他bandEUTRA-r10多了一层的CA组合的大括号,所以如果给每一行增加索引的话就会发现除了第一个bandEUTRA-r10,其他bandEUTRA-r10到上一个supportedMIMO-CapabilityDL-r10的距离都是一样的,为了减少复杂度,我删除了所有’{’,这样所有除了所有CA组合第一个bandEUTRA-r10往上第四行是’}’其他bandEUTRA-r10的往上第四行都是supportedMIMO-CapabilityDL-r10
功能实现:
添加索引:便利时用了for enumerate()循环,这样便利时可以在循环时,自动为每个元素生成索引
CA组合识别:在识别到bandEUTRA-r10时,增加一个判断ifdatalist1[index-4].startswith(),如果bandEUTRA-r10的往上第四行是supportedMIMO-CapabilityDL-r10说明同组CA未结束,把筛选的有效信息强制类型转换后添加在上个元素末尾,反之则说明是个新的CA组合,往列表里添加一个新的元素。
需求三:
之后收到反馈CA组合虽然识别了,但是排序不行,需要按照CA组合支持的band进行排序
功能实现:
排序:于是我在识别完CA组合后,增加了一个循环和count(),用CA组合里的’-’给它们归类
比如1AA,11A,21AA是一类;1A-1A,2A-1AA,3A-1A是一类
在用一个中间变量保存开头的band的数字,一个类中把开头支持band的数字字母相同的CA组合归为一行
比如1A-21A,1A-22A一类1AA-2AA 1AA-3AA为一类
需求四:
之后收到反馈,CA组合分类不能只按照开头比较分类,不然一但数据多了会对查阅带来极大不便,应该按照每组CA组合中bandEUTRA-r10的值进行判断,比如1AA-2AA,1A-2AA和1AA-2A应该归在同一行
实现原理:首先我想的是按位比较数字,但是因为字母的数量不稳定,数字的位置不一定对应,然后我就想把数字全部提取出来作为索引,在相应的索引后面添加同组元素,用dict来实现排序。难点就在于从字符串中提取数字。后来在python的正则表达式中找到相关的处理函数compile()(设置匹配对象类型)和findall()(找到所有匹配对象并以list返回)。
功能实现:
第二次排序:在上次的排序中我保留了分类和从小到大的排序。方便提取索引时,索引也是从小到大。每遍历一个元素(CA组合有效信息),就compile()和findall(),从该元素中提取数字组合(在compile()的参数中添加()就能够使提取的内容成为一组数据),然后通过dict自带函数setdefault()添加索引,并可以设置索引值为list类型(dict类型的索引的值不可变,但如果类型为list,list的内容可以进行改动),避免重复索引,在本次遍历中完成将元素添加到索引值对应的list中去
需求五:
之后对程序进行测试,在测试test2时发现layers增加了fourlayers类型后,用来代表layers的数字2和4会影响分类结果。比如1AA(2)-1AA(2)和1A(4)-1A(2)会被归为两类。
test1:当CA组合的格式为xx-xx-xx-xx-xx(最长可识别为五位元素的组合,再长就需要修改代码)
test2:当CA组合包含fourLayers
test3:当CA组合缺失某种格式比如xx-xx时发现layers增加了fourlayers
功能实现:
: 解除layers对排序的影响:用II 和 IV替代2,4来表示layers,测试后不影响阅读与分类
二、整体程序架构:
1.通过循环和自带的startswith()先将每组CA组合的有效信息识别
2.通过sorted()函数将所有CA组合从小到大排列
3.通过count()函数将所有CA组合根据格式不同分类
4.通过循环和正则表达式的split()对所有CAlist数据进行处理(用split处理只是防止出现不必要的错误)
5.通过循环和正则表达式compile()和findall()识别所有CA组合中数字,并将同一组合中的数字合为一个元素(在同一循环,用这个数字的元素作为一个dict的索引),用dict自带的setdefault()进行Key的添加顺便设置Key的值为list,避免Key重复,在用append把当前Key的字符串,添加到Key对应值的list中去
6.最后对dict整体遍历,将每一个Key的值输出到文本中去。
ca-BandwidthClassUL-r10
ca-BandwidthClassDL-r10
supportedMIMO-CapabilityDL-r10
功能实现:
有效信息筛选:于是就用循环把UECapabilityInformation的数据里每一行作为一个元素放到list里面
然后用bandEUTRA-r10作为一组CA的识别信息、在筛选出同组ca-BandwidthClassUL-r10、ca-BandwidthClassDL-r10、supportedMIMO-CapabilityDL-r10的信息,添加保存到字符串中,然后再把字符串作为元素添加到list中去。最后遍历list的元素写入目标文件
需求二:
然后收到反馈CA组合的理解是错误的。一组CA组合应该是以大括号作为识别的,里面可能包含多组:
bandEUTRA-r10:
ca-BandwidthClassUL-r10
ca-BandwidthClassDL-r10
supportedMIMO-CapabilityDL-r10
CA组合识别原理:在查看UECapabilityInformation内的CA组合后 发现CA组合内第一个 bandEUTRA-r10因为比其他bandEUTRA-r10多了一层的CA组合的大括号,所以如果给每一行增加索引的话就会发现除了第一个bandEUTRA-r10,其他bandEUTRA-r10到上一个supportedMIMO-CapabilityDL-r10的距离都是一样的,为了减少复杂度,我删除了所有’{’,这样所有除了所有CA组合第一个bandEUTRA-r10往上第四行是’}’其他bandEUTRA-r10的往上第四行都是supportedMIMO-CapabilityDL-r10
功能实现:
添加索引:便利时用了for enumerate()循环,这样便利时可以在循环时,自动为每个元素生成索引
CA组合识别:在识别到bandEUTRA-r10时,增加一个判断ifdatalist1[index-4].startswith(),如果bandEUTRA-r10的往上第四行是supportedMIMO-CapabilityDL-r10说明同组CA未结束,把筛选的有效信息强制类型转换后添加在上个元素末尾,反之则说明是个新的CA组合,往列表里添加一个新的元素。
需求三:
之后收到反馈CA组合虽然识别了,但是排序不行,需要按照CA组合支持的band进行排序
功能实现:
排序:于是我在识别完CA组合后,增加了一个循环和count(),用CA组合里的’-’给它们归类
比如1AA,11A,21AA是一类;1A-1A,2A-1AA,3A-1A是一类
在用一个中间变量保存开头的band的数字,一个类中把开头支持band的数字字母相同的CA组合归为一行
比如1A-21A,1A-22A一类1AA-2AA 1AA-3AA为一类
需求四:
之后收到反馈,CA组合分类不能只按照开头比较分类,不然一但数据多了会对查阅带来极大不便,应该按照每组CA组合中bandEUTRA-r10的值进行判断,比如1AA-2AA,1A-2AA和1AA-2A应该归在同一行
实现原理:首先我想的是按位比较数字,但是因为字母的数量不稳定,数字的位置不一定对应,然后我就想把数字全部提取出来作为索引,在相应的索引后面添加同组元素,用dict来实现排序。难点就在于从字符串中提取数字。后来在python的正则表达式中找到相关的处理函数compile()(设置匹配对象类型)和findall()(找到所有匹配对象并以list返回)。
功能实现:
第二次排序:在上次的排序中我保留了分类和从小到大的排序。方便提取索引时,索引也是从小到大。每遍历一个元素(CA组合有效信息),就compile()和findall(),从该元素中提取数字组合(在compile()的参数中添加()就能够使提取的内容成为一组数据),然后通过dict自带函数setdefault()添加索引,并可以设置索引值为list类型(dict类型的索引的值不可变,但如果类型为list,list的内容可以进行改动),避免重复索引,在本次遍历中完成将元素添加到索引值对应的list中去
需求五:
之后对程序进行测试,在测试test2时发现layers增加了fourlayers类型后,用来代表layers的数字2和4会影响分类结果。比如1AA(2)-1AA(2)和1A(4)-1A(2)会被归为两类。
test1:当CA组合的格式为xx-xx-xx-xx-xx(最长可识别为五位元素的组合,再长就需要修改代码)
test2:当CA组合包含fourLayers
test3:当CA组合缺失某种格式比如xx-xx时发现layers增加了fourlayers
功能实现:
: 解除layers对排序的影响:用II 和 IV替代2,4来表示layers,测试后不影响阅读与分类
二、整体程序架构:
1.通过循环和自带的startswith()先将每组CA组合的有效信息识别
2.通过sorted()函数将所有CA组合从小到大排列
3.通过count()函数将所有CA组合根据格式不同分类
4.通过循环和正则表达式的split()对所有CAlist数据进行处理(用split处理只是防止出现不必要的错误)
5.通过循环和正则表达式compile()和findall()识别所有CA组合中数字,并将同一组合中的数字合为一个元素(在同一循环,用这个数字的元素作为一个dict的索引),用dict自带的setdefault()进行Key的添加顺便设置Key的值为list,避免Key重复,在用append把当前Key的字符串,添加到Key对应值的list中去
6.最后对dict整体遍历,将每一个Key的值输出到文本中去。
相关文章推荐
- java实现数据结构练习题--仅使用处理单个数字的I/O例程,编写一个过程以输出任意实数(可以是负的)
- (用指针方法处理)有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。编写一个函数实现上述功能,在主函数中输入n个整数,并输出调整后的n个数
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象[修订081217]
- 案例:一个系统功能实现方式引发的隐形需求
- 一个利用了异步处理,事件驱动,对象序列化等技术的类Parser完整代码示例
- 用Java语言编写一个绘图项目的完整过程
- hchxxzx--》一个实现图片上传/产生缩略图/在上传图片上写字功能的完整页面代码
- 利用VC和ADO接口编写一个dll模块实现对数据库数据的处理
- JAVA编写的浏览器,在别人的基础上做了些许修改,实现了前进,后退,刷新功能,添加了一个搜索框,具体情况在运行结果中的文件-->注意中
- 编写一个控制台程序,实现以下功能
- 一个数据库中数据求差集需求的处理过程
- Android 一个相对完整的自动升级功能实现代码
- 编写一个电话簿,可以实现增删查找的功能
- 创建一个宏,实现通过excel导出TXT文本功能
- 请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- 利用VC和ADO接口编写一个dll模块实现对数据库数据的处理
- [JavaScript] 你相信么,只需一个函数5行JS代码即可在Javascript中实现完整的AOP功能,
- 一个函数5行代码即可实现完整的面向方面AOP编程功能
- 编写一个函数,实现两个字符串的连接功能
- 【VB.NET】打造一个象棋魔法学校的老师——谨以此文献给象棋爱好者——编写界面和功能的最终实现