下面的VB6替换文本的程序为何对某些文本文件不起作用?

ssq119 2012-04-14 11:09:18
以下是对c:\temp.txt进行正则替换的一段代码,对多数文本文件都能起作用,但也有时对某些文本文件会报“无效的过程调用或参数”错,再调试时会指向代码尾部的“objFile.WriteLine strTxt”并将c:\temp.txt中的文本全部删除使其变为0字节文件。

如果运行代码前将c:\temp.txt(可点击下面链接下载)在记事本中打开不做任何改动仅重新存盘一次,再运行代码又没有上述问题了。

不知何故,请指点解决办法。谢谢!

http://dl.dbank.com/c0z8ljjfbc

Private Sub Command1_Click()
'
Const ForReading = 1
Const ForWriting = 2
Dim strTxt As String '用于查找替换的文本
Dim expTxt As String '查找串(可用正则表达式)
Dim repTxt As String '替换串
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\temp.txt", ForReading)
strTxt = objFile.ReadAll
objFile.Close
strTxt = StrReplace(strTxt, "\\l\(([^\)]+)\)", "$1")
strTxt = StrReplace(strTxt, "\\d\\fo\d+\\li\(([^\)]*)\)", "[CD#3]$1")
strTxt = StrReplace(strTxt, "\\d\\fo\d+\(([^\)]*)\)", "[KG2]$1")
'……
Set objFile = objFSO.OpenTextFile("c:\temp.txt", ForWriting)
objFile.WriteLine strTxt
objFile.Close
Set objFSO = Nothing
Set objFile = Nothing
MsgBox "OK"
End Sub

Function StrReplace(strTxt As String, expTxt As String, repTxt As String) As String
'正则替换的函数
Dim RegEx As New VBScript_RegExp_55.RegExp '定义一个新的正则表达式对象
RegEx.Global = True '全程查找
RegEx.IgnoreCase = False ' 区分大小写
RegEx.Pattern = expTxt
StrReplace = RegEx.Replace(strTxt, repTxt)
End Function
...全文
158 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bcrun 2012-04-16
  • 打赏
  • 举报
回复
#4楼说的有道理,记事本处理特殊字符的方式与一般的不同,比如经常打开文件看到小黑方块。
Tiger_Zhao 2012-04-16
  • 打赏
  • 举报
回复
你的文件中含有字符 Chr(0),这不属于正常的文本文件,不同的程序会有不同的容错性。
很明显,记事本容错性较高,将它们过滤掉了。
而 FileSystemObject 可能认为文件格式错误,将全部内容都丢弃了。
bcrun 2012-04-16
  • 打赏
  • 举报
回复
一般来说,你应对码值低于32的除制表符chr(7)和回车换行符之外的字符都过滤掉。
ssq119 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
保存时也做了过滤,你用 WinHex 之类的十六进制编辑器打开,就会发现有些字符被丢弃或替换了。[/Quote]

谢谢虎兄!你已让我受益匪浅了。

我有另找WinHex 之类的十六进制编辑器打开看看。保存时Chr(0)是否做了过滤,我发7楼帖前已用简单方法证实了,方法:在Word中再次打开temp.txt,再查找^0,发现能找到。只是没想过这种方法是否可靠。
Tiger_Zhao 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]在Word中用下面的宏命令获得一些特殊字符等:

For i = 0 To 132
ActiveDocument.Content.InsertAfter Text:=Chr(i)
Next

并另存为文本文件c:\temp.txt,编码选“简体中文(GB2312)”,再测试顶楼的代码,奇怪的是这次又没有问题。
[/Quote]
保存时也做了过滤,你用 WinHex 之类的十六进制编辑器打开,就会发现有些字符被丢弃或替换了。
jthkl 2012-04-16
  • 打赏
  • 举报
回复
是否因为文件内码的问题。一般文本文件有unicode和ansi之分,fso对象缺省应该是ansi吧(好像:))?,当以错误的方式读取文件时难免有不可预料的情况发生。记事本是可以自动区别所有的格式的,而word这样的功能及强大的程序当然不可能写一些错误字符进去。具体情况建议用十六进制编辑器仔细看看。
ssq119 2012-04-16
  • 打赏
  • 举报
回复
谢谢楼上2位!

我按虎兄的说法删除Chr(0)后果然无问题,正准备结帖时,突然想看看还有无其他字符有类似影响,故在Word中用下面的宏命令获得一些特殊字符等:

For i = 0 To 132
ActiveDocument.Content.InsertAfter Text:=Chr(i)
Next

并另存为文本文件c:\temp.txt,编码选“简体中文(GB2312)”,再测试顶楼的代码,奇怪的是这次又没有问题。
ssq119 2012-04-15
  • 打赏
  • 举报
回复
这个可直接下载顶楼的文本文件。
http://www.box.com/s/b119c98de8b97cb9dcc1
ssq119 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
想答个问也这么麻烦,还要去注册华为网盘才能下载,算了,还是等有这个美国时间的去弄吧。
[/Quote]

哦,不还不知道华为网盘中的外链文件也要注册才能下载,还是用一个老外的吧,可直接下载的:
http://www.box.com/s/b119c98de8b97cb9dcc1
bcrun 2012-04-15
  • 打赏
  • 举报
回复
想答个问也这么麻烦,还要去注册华为网盘才能下载,算了,还是等有这个美国时间的去弄吧。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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