请教如何批量处理掉似上标的符号?

armstrong

高级会员
最近,有一批语料须处理,目的想去除像是下画线及其上的上标,样本中如12,13及其下面的线条。
谢谢!
 

附件

  • sample.doc
    29.5 KB · 浏览: 12
VBA

The following code has been successfully tested against your sample file
代码:
Sub clear_superscript()
Selection.HomeKey Unit:=wdStory
Do
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
If Selection.Font.Position > 0 Then Selection.Delete Unit:=wdCharacter, Count:=1
Selection.MoveRight Unit:=wdCharacter, Count:=1
If Selection.End = ActiveDocument.Range.End - 1 Then Exit Do
Loop
End Sub
 
我在Word 2003中测试的效果

运行我的宏之后,那些“12,13”上标都消失,虽然残留了天蓝色的少量下划线,但另存为txt就彻底没有了,或者全选复制到“记事本”也彻底干净了。
 
由于样本不完整,现有代码是扫描所有字符且基于上标判断的

在分析你样本的“12”和“13”的时候,发现它俩是表面上的“书签”身份,但,按照把书签进行VBA批量删除也无法清除“12,13”,所以进一步发现“12,13”的真正身份其实是脚注或尾注,但是,样本是被你手工特地复制的超级小而不完整的效果,所以按照脚注尾注也无法用VBA进行自动识别与清除,虽然手工点菜单“插入”的“书签”可以看到它俩。因此,在上面的波折之后,我采用了扫描当前文件的所有字符的办法,对每个字符都进行“If Selection.Font.Position > 0”的判断,那“12,13”的font.position就是等于3,而其他正常字符都是等于0,这font.position的取值,对于上标字符就是大于零,对于下标字符就是小于零的。

如果是一份完整的样本doc文件,就能采用ActiveDocument.BookMarks(1).delete(),或者ActiveDocument.FootNotes(1).delete()或者ActiveDocument.EndNotes(1).delete(),然后搭配循环语句就清除所有“12,13”了,整套代码也简洁得多,如下:

代码:
Sub clear_endnotes()
n = ActiveDocument.Endnotes.Count
For c = 1 To n
ActiveDocument.Endnotes(1).Delete
Next
End Sub
或者

代码:
Sub clear_footnotes()
n = ActiveDocument.Footnotes.Count
For c = 1 To n
ActiveDocument.Footnotes(1).Delete
Next
End Sub
或者

代码:
Sub clear_bookmarks()
n = ActiveDocument.Bookmarks.Count
For c = 1 To n
ActiveDocument.Bookmarks(1).Delete
Next
End Sub
这样,代码量就减少了30%,运行速度应该也显著提高了,运行期间占用内存而表现出“忙得不响应”的状况也应该显著缓解了,因为第一套做法对所有字符的扫描判断其实是冗余的,毕竟只有极少数字符是“12,13”,而第二套做法仅对“12,13”这样的字符进行直接定位删除,所以,运行更加轻快,而你也要注意每个doc文件用VBA进行处理的时候,每份文件的页码量超过100页就要挺长的时间甚至深陷假死机而久久不能脱身。

经过实测,上面3段小代码都能完美清除当前文件的“所有书签、所有脚注、所有尾注”。
 
如果你每个doc文件都很大,都是一个小说,那么……

用我VBA代码也会显得耗时挺长且反应迟缓的,那么,最简单的大幅度缓解办法是你打开每个doc语料文件的时候,就立即关闭“自动拼写语法检查”,关闭“自动套用格式”,关闭自动分页,再运行VBA来自动处理就轻松很多,时间也大大节省了。关闭自动分页,就是在视图中选择“web版式”。关闭自动套用格式,就是把自动套用格式的10多个打了勾勾的选项都取消勾选。
 
Back
顶部