解析这种文本文件应该用什么思路?

2017-06-21 18:26:01 +08:00
 raiz

一个老项目用了这种规则描述设备的参数, 请问:应该用什么思路解析? 引申:json,xml 这种文本的解析算法有什么共性?

#deviceLamp*灯光
1,3,4,1,100,0,0,1,吊灯
1,3,4,2,0,0,0,0,台灯
1,3,4,3,100,0,0,1,壁灯
#Enddevice
#deviceLightScreen*灯光模式
1,1,0
#Enddevice
#deviceLightObject*1
#Enddevice
#deviceCurtain*窗帘
1,南窗,1,1
2,西窗,2,1
#Enddevice
#deviceCurtainObject*1
开,1,4,3,0,1
关,0,4,3,0,2
停,0,4,3,0,0
#Enddevice
#deviceCurtainObject*2
开,1,4,3,1,1
关,1,4,3,1,2
停,1,4,3,1,0
#Enddevice
2817 次点击
所在节点    程序员
11 条回复
shoaly
2017-06-21 18:48:58 +08:00
正则
lnim
2017-06-21 18:58:16 +08:00
楼上+1
mcfog
2017-06-21 19:03:48 +08:00
去看下编译原理吧

或者这种几乎不需要什么 lexer 的格式,简单看下状态机相关的东西就很容易手写 laser 了
SlipStupig
2017-06-21 19:15:53 +08:00
判断每一行的汉字,如果是开 /关 /停就写到参数里面,然后剩余的全是参数,如果匹配不到就无法描述。
用正则+map 最合适不过了
guyskk
2017-06-21 20:42:13 +08:00
这个没有嵌套,规则也很简单,直接按行读取,正则+逗号分割就行了。
raiz
2017-06-21 23:08:28 +08:00
@shoaly
@lnim
@guyskk 这种简单的应该逐行正则+状态机可以做到。

@mcfog 用上词法分析的方法估计会优雅点(还没有概念)
secondwtq
2017-06-22 00:11:19 +08:00
共性?我觉得是递归
顺便简单格式要求不高的话,有个贼好用的东西叫 parser combinator
neoblackcap
2017-06-22 00:19:04 +08:00
同意 @secondwtq 的观点,若是对性能要求不高的话,parser combinator 还是一个很不错的选择,快速有效解决问题。
nicevar
2017-06-22 07:33:48 +08:00
应用场景不大自己写个简单的解析就行了,也不是什么老设备问题,偏硬件底层方面基本上都这样写,比如一些 LED 灯驱动和 TV 启动配置程序
araraloren
2017-06-22 09:02:29 +08:00
简单的需求就直接硬解析就行了。。 就像 5 楼说的,直接分隔,提取,简单正则就解决了
RubyJack
2017-06-22 10:19:55 +08:00
我觉得按行分割一下就可以处理了...简单粗暴

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370125

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX