BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #25478同步于 2008/5/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

跪求一个简单的文本文件的分析脚本

wks
2008/5/17镜像同步7 回复
现在遇到一个问题。急。 以下是一个大列表,纯文本格式,字符集好办,我会转换。文件格式大概如下: /****************** begin 这行不在文件中 */ = 1 基本概念 1.1 数据类型 1.2 运算符 1.3 表达式 1.4 语句 = 2 流程控制 2.1 顺序结构 2.2 选择结构 2.3 循环结构 = 3 函数 3.1 函数的概念 3.2 函数的定义和调用 3.3 函数的嵌套调用 3.4 函数的递归调用 = 4 指针 4.1 指针的概念 4.2 指针的定义 4.3 指向数组的指针 4.4 指针数组和指向指针的指针 = 5 结构体 共用体 5.1 数据类型与集合 5.2 交集、并集、笛卡尔乘积 5.3 结构体的定义 5.4 结构体成员引用 5.5 指向结构体的指针 5.6 共用体 5.7 结构体、共用体嵌套 = 6 文件IO 6.1 打开文件、关闭文件 6.2 文件定位 /*************************** end 这行也不在文件中 */ 格式: 这是一本书的目录。书的大标题叫《C语言基础》 凡是以=开头的行是“章”标题,其它的是“节”标题。空行无效。 一章后面跟着的若干节属于该章。 章标题,=后面跟1个或多个空格,然后是章编号,然后一个或多个空格,然后到行尾(忽略行尾空格)都是章标题。 节标题,第一个字段是节编号,之后的是节标题,前后空格不计。 我需要做一个小程序,输入是这个表,对于每章输出一个文件,是这一章的目录,包括该章的所有节的标题。最后输出一个文件,是全书目录,只包含全书大标题《C语言基础》和每章标题,不要节标题。 文件特别大,不要妄想slurp,要On the fly处理,每读完一节生成一个文件。最后生成总目录文件。 大概是这样: 1_基本概念.xml <chapter> <num>1</num> <title>基本概念</title> <sections> <section><num>1.1</num><title>数据类型</title></section> <section><num>1.2</num><title>运算符</title></section> <section><num>1.3</num><title>表达式</title></section> <section><num>1.4</num><title>语句</title></section> </sections> </chapter> 2_流程控制.xml <chapter> <num>2</num> <title>流程控制</title> <sections> <section><num>2.1</num><title>顺序结构</title></section> <section><num>2.2</num><title>选择结构</title></section> <section><num>2.3</num><title>循环结构</title></section> </sections> </chapter> 其它章类似。 大目录如下: <book> <title>C语言基础</title> <chapters> <chapter><num>1</num><title>基本概念</title></chapter> <chapter><num>2</num><title>流程控制</title></chapter> <chapter><num>3</num><title>函数</title></chapter> <chapter><num>4</num><title>指针</title></chapter> <chapter><num>5</num><title>结构体 共用体</title></chapter> <chapter><num>6</num><title>文件IO</title></chapter> </chapters> </book> 要求:代码美观整洁,主要是流程控制部分。 什么语言都行。 大牛来帮帮忙 在线等。
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
yegle机器人#1 · 2008/5/17
正则匹配?你都把规则总结出来了…… 【 在 wks (cloverprince) 的大作中提到: 】 : 现在遇到一个问题。急。 : 以下是一个大列表,纯文本格式,字符集好办,我会转换。文件格式大概如下: : /****************** begin 这行不在文件中 */ : ...................
wks机器人#2 · 2008/5/17
说的容易,这个分析器的流程怎么写?而且要写得漂亮。
wks机器人#3 · 2008/5/17
这是一个很ugly的伪代码: ############################################## lst = open('list.txt') book_title = "C语言" chap_list = [] ln = lst.readline() while True: if ln=="": break ln = ln.strip() if ln=="": continue if ln[0]=='=': lp = ln.split()[1:] (chap_no,chap_title) = (lp[0]," ".join(lp[1:])) chap_list.append((chap_no, chap_title)) sect_list=[] while True: ln = lst.readline() if ln=="": break ln = ln.strip() if ln=="": continue lp = ln.split() if lp[0]=='=': break (sect_no,sect_title) = (lp[0]," ".join(lp[1:])) sect_list.append((sect_no,sect_title)) wf = open(chap_no+".xml","w") content = makechapter() wf.write(content) wf.close() wf = open('index.xml','w') content = makebook() wf.write(content) wf.close() ######################################### 看,readline()散步得到处都是,还有各种乱七八糟的条件判断,还有各种break,continue什么的。能不能把这个代码写得*beautiful*一点呢?
winton机器人#4 · 2008/5/17
正则表达式。。 【 在 wks (cloverprince) 的大作中提到: 】 : 现在遇到一个问题。急。 : 以下是一个大列表,纯文本格式,字符集好办,我会转换。文件格式大概如下: : /****************** begin 这行不在文件中 */ : ...................
atian25机器人#5 · 2008/5/18
google 正则
wks机器人#6 · 2008/5/18
嗯,正则式果然很好很强大。 # coding: gb2312 import re rechap = re.compile(r'^\s*=\s+(?P<chap_no>\d+)\s+(?P<chap_title>\S.*)\s*$') resect = re.compile(r'^\s*(?P<sect_no>\d+\.\d+)\s+(?P<sect_title>\S.*)\s*$') srcfile = open("list.txt"); booktitle="C programming" chaplist=[] sectlist=[] curchap=None for ln in srcfile: m=rechap.match(ln) if m != None: writechap() curchap=m.group('chap_no','chap_title') chaplist.append(curchap) sectlist=[] else: m=resect.match(ln) if m != None: sectlist.append(m.group('sect_no','sect_title')) else: pass writebook() 本来想用一个正则表达式匹配整个文件的,后来还是没有成功。
songshu机器人#7 · 2008/5/20
【 在 wks 的大作中提到: 】 : 嗯,正则式果然很好很强大。 : # coding: gb2312 : import re : ................... 匹配整个文件是可以的, 加一个无用行的正则式 regexp = re.compile(r'''^\s*=\s+(?P<chap_no>\d+)\s+(?P<chap_title>\S.*)\s*$) |^\s*(?P<sect_no>\d+\.\d+)\s+(?P<sect_title>\S.*)\s*$ |(.*)\n""", re.VERBOSE) 然后用regexp.scanner 去匹配文件 scanner = regexp.scanner() while 1: m = scanner.match(file) 然后根据m.groups()处理