标题: 求vbs处理文本的脚本
[打印本页]
作者: kcdsw
时间: 2007-3-25 08:08
标题: 求vbs处理文本的脚本
各位老师好
因为手头上有不少doc文件需要做处理,想处理成xml格式的.
可是word里的xml格式与我想要的不相符.
我在网上找了很久 也不得要领. 特向大家求救!
之所以考虑用vbs , 目的是想最终用word 的宏来实现自动处理.
希望各位路过的兄弟们能帮我出出主意!
原文件结构.(doc)
第一卷(卷名)第一章(章名)
正文
第一卷(卷名)第二章(章名)
正文
.......
第二卷(卷名)第一章(章名)
正文
第二卷(卷名)第二章(章名)
正文
........
目标结构:(xml)
<book>
<juan>卷名
<zhang>章名
<zhengwen>正文
</zhengwen>
</zhang>
</juan>
<juan>卷名
<zhang>章名
<zhengwen>正文
</zhengwen>
</zhang>
</juan>
</book>
在众多朋友的帮助下,终于有了解决方案
目前输出的xml已经是标准xml了
我还想添加上 拖拽功能,和选择框效果
找了N多帖子,不得要领 还请各位兄弟帮忙
on error resume next
dim n,y
set ws=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("needhelp.txt",1)
do while file.atendofstream<>true
'去除前导空格
n=ltrim(file.readline)
'调用pd
call pd(n)
s=s & n & vbcrlf
loop
file.close
h=instr(s,"<juan>第")
jiewei=left(s,h-6):kaishi=mid(s,h-2)
set file=fso.createtextfile("out.xml",ture)
head ="<?xml version=""1.0"" encoding=""UTF-8""?>" & vbcrlf & "<book>" & vbcrlf
foot =VbCrLf & "</book>"
file.write head & kaishi & jiewei & foot
file.close
ws.run "explorer out.xml"
sub pd(a)
l=instr(a," ")
z=left(a,l-1)
'用空格分割字符
sp=split(a," ")
if left(z,1)="第" and right(z,1)="卷" Then
if y=z then
n=" </zhengwen>" & VbCrLf & " </zhang>" & " <zhang>"& vbcrlf & sp(0) & " " & sp(1) & " " & sp(2) & " " & sp(3) & VbCrLf & " <zhengwen>"
else
n=" </zhengwen>" & VbCrLf & " </zhang>" & vbcrlf & " </juan>" & VbCrLf & " <juan>" & sp(0) & " " & sp(1) & VbCrLf & " <zhang>" & sp(2) & " " & sp(3) & VbCrLf & " <zhengwen>"
end if
y=z
else
n=a
end If
end sub
Last edited by kcdsw on 2007-3-26 at 05:30 AM ]
附件
1:
needhelp.txt (2007-3-25 11:20, 13.6 KiB,下载次数: 14)
作者: slore
时间: 2007-3-25 10:47
VB好说,vbs没有里面的Like函数。。。麻烦啊
作者: jmz573515
时间: 2007-3-25 10:53
如果是在记事本里可能处理起来还能方便点...
作者: kcdsw
时间: 2007-3-25 11:10
呵呵 首先感谢楼上两位
也感谢所有关注这个帖子的朋友.
因为我自己不怎么懂编程.对一些高深的用法也不知道.
我自己有两种想法.
1是能够直接用word 宏来按照一定的规则来输出一个标准的xml 哪怕我再稍微手工修改一下都成, 目前这个方法还没有进入实质的阶段
2,利用word的宏,能够自动在卷章前加xml的标记
如 </zhang></juan><juan>
然后把这个文档存成txt,再手动调整一下.就基本能满足需要了.目前这个方法还在以纯手工来实现.不知道有没有其他思路.
再次谢谢 各位的关注
再次感谢
作者: kcdsw
时间: 2007-3-25 11:13
Originally posted by slore at 2007-3-25 10:47:
VB好说,vbs没有里面的Like函数。。。麻烦啊
谢谢你的回答.刚才我再次查看了word的宏,窗口的标题是micro visual basic
我不知道这里能不能满足这个函数.
兄弟能再详细的解释一下么?
作者: jmz573515
时间: 2007-3-25 11:13
我的意思是说VBS读取WORD(处里WORD)比较麻烦,处理文本文件能好些...
作者: kcdsw
时间: 2007-3-25 11:17
Originally posted by jmz573515 at 2007-3-25 11:13:
我的意思是说VBS读取WORD(处里WORD)比较麻烦,处理文本文件能好些...
谢谢
刚才没明白你的意思
这样也行.
只要能达到目的 就够了 我就是想把这些数据处理成xml
作者: baomaboy
时间: 2007-3-25 11:35
呵呵 不懂xml这东西 所以我就只能提供编程之外的可能性了
①用EmEditor作编辑器,用录制宏的方式尽可能的把大量繁重繁多的操作录制,然后你就可以一直F4了,然后改那些无法用录制宏操作的地方。
②有一个排版方面的软件DreamEdit,如果编程无法解决的话也建议尝试下。
想当初几百个.htm的模版文件.......呵呵全靠他们了。
只是个建议,在此不一定有效^_^
作者: slore
时间: 2007-3-25 11:49
result="第一卷(卷名)第一章(章名)" Like "第*卷(*)第*章(*)"
这个返回true!
所以可以判断那行包含卷名和章名,然后利用instr和mid可以截取到他们
result是false的部分那么就是正文了!
Last edited by slore on 2007-3-24 at 11:30 PM ]
作者: jmz573515
时间: 2007-3-25 22:00
不知道可不可以,请在测试后使用...
on error resume next
dim n
set ws=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("needhelp.txt",1)
do while file.atendofstream<>true
n=ltrim(file.readline)
call pd(n)
s=s & n & vbcrlf
loop
file.close
h=instr(s,"<juan>第")
jiewei=left(s,h-6):kaishi=mid(s,h-2)
set file=fso.createtextfile("out.xml")
file.write "<book>" & vbcrlf
file.write kaishi & jiewei & vbcrlf
file.write "</book>"
file.close
ws.run "notepad.exe out.xml"
sub pd(a)
l=instr(a," ")
z=left(a,l-1)
sp=split(a," ")
if left(z,1)="第" and right(z,1)="卷" then
n=" </zhengwen>" & vbcrlf & " </zhang>" & vbcrlf & " </juan>" & vbcrlf & " <juan>" & sp(0) & " " & sp(1) & vbcrlf & " <zhang>" & sp(2) & " " & sp(3) & vbcrlf & " <zhengwen>"
else
n=a
end if
end sub
作者: everest79
时间: 2007-3-25 22:48
word内置强大的逻辑替换工具,你可以直接将代码替换进去后另存为txt格式再改名为xml就行了
作者: slore
时间: 2007-3-25 22:57
left(z,1)="第" and right(z,1)="卷"?
正文如果也满足这个条件不难吧?
作者: kcdsw
时间: 2007-3-25 23:58
Originally posted by slore at 2007-3-25 22:57:
left(z,1)="第" and right(z,1)="卷"?
正文如果也满足这个条件不难吧?
是不是说正文如果有了这样的数据 会出问题?
作者: kcdsw
时间: 2007-3-26 00:00
Originally posted by jmz573515 at 2007-3-25 22:00:
不知道可不可以,请在测试后使用...
on error resume next
dim n
set ws=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
...
非常感谢关注本帖的朋友
感谢你的代码
我这里测试了一下 成功了.
可能还有一些其他的问题,目前正在研究你的代码
问题:
卷章嵌套不正确
卷一
章一
章二
卷二
章一
章二
作者: kcdsw
时间: 2007-3-26 00:07
Originally posted by everest79 at 2007-3-25 22:48:
word内置强大的逻辑替换工具,你可以直接将代码替换进去后另存为txt格式再改名为xml就行了
我只会用简单的替换
还望赐教
作者: everest79
时间: 2007-3-26 01:35
介个介个
使用通配符妙查Word文档
jinqq
在Word中有一项“查找”的功能,利用它我们可以迅速地找到要编辑或者修改的文字,该功能的使用方法如下:单击“编辑”菜单中的“查找”命令,即可弹出“查找和替换”对话框,在“查找内容”中我们可以输入要查找的内容,Word查找不但支持像“*”和“?”这样的常见通配符,还支持像“[]”、“@”等不常见的通配符,要使用这些不常见的通配符必须进行如下设置:在“查找和替换”对话框中,单击“高级”按钮,选中“使用通配符”复选框即可。利用通配符可以令我们的查找工作更加灵活方便,下面就让我们来看一下这些统配符的具体用法。
1、任意单个字符:“?”可以代表任意单个字符,输入几个“?”就代表几个未知字符。比如我们输入“?国”就可以找到诸如“中国”、“美国”、“英国”等字符;输入“???国”可以找到“孟加拉国”等字符。
2、任意多个字符:“*”可以代表任意多个字符。比如我们输入“*国”就可以找到“中国”、“美国”、“孟加拉国”等字符。
3、指定字符之一:“[]”框内的字符可以是指定要查找的字符之一,比如输入“[中美]国”就可以找到“中国”、“美国”。
4、指定范围内的任意单个字符:“[x-x]”可以指定某一范围内的任意单个字符,比如输入“[a-e]ay”就可以找到“bay”、“day”等字符,要注意的是指定范围内的字符必须用升序。
5、排除指定范围内的任意单个字符:“[!x-x]”可以用来排除指定范围内的任意单个字符,比如我们输入“[!c-f]”就可以找到“bay”、“gay”、“lay”等字符,但是不会找到“cay”、“day”等字符。要注意范围必须用升序。
6、指定前一字符的个数:“{n}”可以用来指定要查找的字符中包含前一字符的个数,比如输入“cho{1}se”就是说包含1个前一字符“o”,可以找到“chose”,输入“cho{2}se”就是说包含2个前一字符“o”,可以找到“choose”。
7、指定前一字符数范围:“{x,x}”可以用指定要查找字符中前一字符数范围,比如我们输入“cho{1,2}”,则说明包含前一字符“o”数目范围是1-2个,则可以找到“chose”、“choose”。
8、一个以上的前一字符:“@”可以用来指定要查找字符中包含一个以上的前一字符,比如我们输入“cho@se”,就可以找到“chose”、“choose”等字符。
9、指定起始字符串:“<”可以用来指定要查找字符中的起始字符串,比如我们输入“<ag”,就说明要查找的字符的起始字符为“ag”,可以找到“ago”、“agree”、“again”等字符。
10、指定结尾字符串:“>”可以用来指定要查找字符中的结尾字符串,比如我们输入“er>”,就说明要查找的字符的结尾字符为“er”,可以找到“ver”、“her”、“lover”等等。
另外为了更精确的查找,你还可以把以上的通配符联合起来使用,比如我们输入“<(ag)*(er)>”则表示查找所有以“ag”开头并且以“er”结尾的单词,注意这时需要用括号将来区分开不同的查找规则。最后还要注意如果要查找已经被定义为通配符的字符,如“*”、“?”等字符,必须在该字符前面加上反斜杠“\”,如输入“\*”则表示查找字符“*”。
本文摘自:赛迪网
作者: kcdsw
时间: 2007-3-26 05:17
谢谢楼上的兄弟,我试了一下
感觉很好
但是 它的适用性太广了
还是采用vbs 的一读一行的方式比较好处理呢!
作者: everest79
时间: 2007-3-26 08:03
你是海量字符,要是一行一行来,多费工夫
作者: kcdsw
时间: 2007-3-26 08:28
呵呵 是这样的
word的是整个文档一起来的
结果就是把第一卷的第字与第二卷的章字都能配套上
作者: everest79
时间: 2007-3-26 09:07
晕,第?卷与第?章是不同的