求一解决方案:文本文件的遍历、比较、替换

httpftp 2008-11-11 11:14:04
有三个字典,
字典1,“机器文字名”和“型号”的对应关系,1:N,例:
机器A NH-1 NH-2 CXY
机器B SIO-10 SIO-11

字典2,“机器文字名”和变换方法的对应关系,1:N,例(“条件”和“操作”都是变换前的字符串):
机器名 条件 操作 变换后
机器A .AS==HI .BST="CTUP"
.AS==LO .BST="PALM"
.AS=STR .OP=TMS
.AS=STOP .OP=TMSTOP
机器B .AS .@ALAM
.MODE .@MODE
.MODE .LS

字典3,“型号”和“假名”的对应关系,1:N,例:
型号 假名
NH-1 S5106
NH-1 S5107
NH-1 S5108
NH-2 SVA01
SIO-10 SCV1001
SIO-10 SCV1002

需要被替换的文件是一种自定义的程序语言文件,纯文本格式,字典3实际上是程序文件中的静态变量定义,字典1和字典2是EXCEL。
字典2中的.AS .MODE .BST是属性,而假名相当于对象,在程序文件中会这样出现:S5106.AS = STR

举一小段例子:
*--<UNIT INTERFACE>--------------------------------------------
global unit name NH-1 S5106
global unit name NH-1 S5107
global unit name NH-1 S5108
global unit name NH-2 SVA01
global unit name SIO-10 SCV1001
global unit name SIO-10 SCV1002

***************************************************************
* MAIN
***************************************************************
*------条件判断------------------------------------------------
LBL020: if (S5106.AS == HI) then * #1
SCV1001.MODE = "OUT" * #2
else
SCV1001.MODE = "IN" * #3
end if
***************************************************************
* 结束
***************************************************************
exit

#1行是“条件”语句,根据假名S5106找字典3,对应NH-1;然后找字典1,对应“机器A”;再查字典2,因为是条件语句,所以应该转换为:if (S5106.BST="CTUP") then
而#2和#3是“操作”语句,最终转换为:SCV1001.LS = "OUT" 和 SCV1001.LS = "IN"
诸如此类的查找替换

我自己的思路是这样的:
1、按行读取文件,直到<UNIT INTERFACE>块结束,做成字典3(每个文件的字义都不相同),将“假名”穷举写成一个正则表达式
2、继续按行读取文件,判断本行是否有假名
3、若有假名,判断是否条件语句,因为条件语句数量有限,也用穷举法写成一个正则表达式
4、查表、替换

我所有的困惑都在第四步,想把三个字典作成两个表:“条件”和“操作”;分3列:“假名”“变更前”“变更后”
但是开发用VB6.0,没有数据库,这两个表要做成什么形式?如果做成数组遍历的话效率会非常低。
文件数量庞大,单个文件本身也可能比较大,效率很重要。

求各位高手给提供一个解决方案,任何方案都可以。
知识的力量是伟大的,思想的碰撞会产生火花,星星之火可以燎原,希望大家不吝赐教。
小生我这里先行谢过了!
...全文
197 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-01-13
  • 打赏
  • 举报
回复
字典其实就是hash呀,用Dictionary应该是最快的了,查找时间为常量.
httpftp 2009-01-13
  • 打赏
  • 举报
回复
项目做完了,中间还返工一次。因为最初需求分析做的太简单了,漏了很多要点。
关于我提问的查找的问题,最后使用了Scripting.Dictionary对象,没有用数组查找,也没用树和Hash。
因为我发现文件读入后做字符串的分析才是最复杂的事情,死了很多脑细胞,所以字典的查找就用了最现成的东西。
最终的成果,实际运行速度还是很不错的。
谢谢三位提供的思路,分数我就平均分了。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tailzhou 的回复:]
没必要这么麻烦;
感觉直接用数组就差不多了;
数组先排序,查找用二分;
[/Quote]
说的是。
本来挺简单的事,用不着树,复杂度还是一样的。
httpftp 2008-11-12
  • 打赏
  • 举报
回复
谢谢几位的提点,我先去写写试试,等把功能实现了再来结贴
  • 打赏
  • 举报
回复
将字典一做成树Tree1,用<型号>作关键字;
将字典三做成树Tree2,用<假名>作关键字;
将字典二做成条件树Tree3和操作树Tree4,用<机器名,变更前>作关键字。
这样当获取到“假名,变更前”之后,先根据假名在Tree2中查出型号,再根据型号在Tree1中查出机器名,最后就可以根据<机器名,变更前>在Tree3或者Tree4中查找替换后的信息。
这样的方案无论在空间还是效率上都应该是可以接受的。

VB中对这些数据结构的处理不方便,可以用C++中的STL封一个组件出来,创建树、查询工作都交给这个组件来完成。
绿色夹克衫 2008-11-11
  • 打赏
  • 举报
回复
做成hash表吧!hash的查找为常数!
tailzhou 2008-11-11
  • 打赏
  • 举报
回复
没必要这么麻烦;
感觉直接用数组就差不多了;
数组先排序,查找用二分;
  • 打赏
  • 举报
回复
VB6的Collection对象功能太弱了一些,还是自己实现好;
不建议在Excel文件中直接进行查找,效率太低了。前面说的也是把Excel读入内存数据结构中,然后在结构中查找数据。

根据字典中的数据特点,如果可行的话,ls说的hash也是个很好的办法。
绿色夹克衫 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 httpftp 的帖子:]
字典1,“机器文字名”和“型号”的对应关系,1:N,例:
机器A NH-1 NH-2 CXY
机器B SIO-10 SIO-11

字典2,“机器文字名”和变换方法的对应关系,1:N,例(“条件”和“操作”都是变换前的字符串):
机器名 条件 操作 变换后
机器A .AS==HI .BST="CTUP"
.AS==LO .BST="PALM"

字典3,“型号”和“假名”的对应关系,1:N,例:
型号 假名
NH-1 S5106
NH-1 S5107
[/Quote]

看了一下要求

对字典1做hash,以型号为key
对字典3做hash,以假名为key

对于字典2,先建立一个2维数组,分别记录机器名、条件、操作、变换后
再按照机器名作排序,然后对机器名的起始index作hash的key,以相同机器名的记录长度作为hash的值,应该就可以满足lz提出的快速检索需要了。

不能用数据库的话,可以用xml,如果数据量不大的话,可以直接用xpath来做,省事儿,就是有点慢。
httpftp 2008-11-11
  • 打赏
  • 举报
回复
dlyme的方案挺有意思,我对VB和C++都不太熟悉,这种做法对我来说很有挑战性

刚才查到VB6有一个Collection对象,请教大家这个对象是不是很好用?

字典一和字典二因为都是EXCEL文件形式,那么使用EXCEL.Application对象,用FIND函数查找执行效率怎么样?

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧