怎样消除VB对文本文件查找替换后在文件尾多出的空行?

ssq119 2008-01-19 10:33:19
下面是对一文本文件进行查找替换的模块:

Private Sub Tihuan(TfilePath As String, Oldstr As String, Newstr As String)
Dim k() As Byte
Open TfilePath For Binary As #1
ReDim k(FileLen(TfilePath) - 1) As Byte
Get #1, , k
k = Replace(StrConv(k, vbUnicode), Oldstr, Newstr) '无条件全部替换
Close #1

Open TfilePath For Output As #2
Print #2, k
Close #2
End Sub

'调用方法

Private Sub Command2_Click()

Command2.Enabled = False

Call Tihuan("c:\1.txt", "旧字符", "新字符") ‘ c:\1.txt 可以超过 5 mb以上

Command2.Enabled = True

但在使用中发现,每调用一次,就在文本文件的最后多一个空行 , 执行1000次就多1000个空行。怎样消除这些空行?

...全文
421 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssq119 2008-01-25
  • 打赏
  • 举报
回复
感谢各位!除帮我解决了问题外,还使我学到不少。
vbman2003 2008-01-24
  • 打赏
  • 举报
回复
嗯,你说的对。可以再完善一下:



Private Sub Tihuan(TfilePath As String, Oldstr As String, Newstr As String)

Dim s As String
Dim h As Long

h = FreeFile
Open TfilePath For Binary As h
s = Space(LOF(h) - 2)
Get h, , s
Close

s = Replace(s, Oldstr, Newstr) '无条件全部替换

h = FreeFile
Open TfilePath For Output As h
Print #h, s
Close

End Sub


如果问题已经解决,请及时结帖。不要凉了上面那么多热心人的心......
zdingyun 2008-01-24
  • 打赏
  • 举报
回复
使用21楼代码,文件长度发生改变,每次较原来多出72字节。8楼代码和我在5楼贴出代码执行字节不增加。
但同意21楼意见;请及时结帖。不要凉了上面那么多热心人的心......
ssq119 2008-01-22
  • 打赏
  • 举报
回复
但17楼的这句:
s=space(lof(#1))
应该为下面一句吧?
s = Space(LOF(1))
ssq119 2008-01-22
  • 打赏
  • 举报
回复
楼上(17楼)的分析应该是对的,我试了下能行。
ssq119 2008-01-22
  • 打赏
  • 举报
回复
楼上(17楼)的分析应该是对的,我试了下能行。
chenhui530 2008-01-21
  • 打赏
  • 举报
回复
print的改成二进制打开使用put
zdingyun 2008-01-21
  • 打赏
  • 举报
回复
9楼,Print改为write,会在整个文件前后加上一对"" 。
cike_1111 2008-01-21
  • 打赏
  • 举报
回复
Print 改为 write 试下!

好象print写入 的 后面自动加上点什么.. 而用另一个就不会有这样的情况 好象是 write吧 好象又是 put.. 不太记得了!
zzyong00 2008-01-21
  • 打赏
  • 举报
回复
如都用文本方式读写,连替换都不能进行。
------------------
什么意思?为什么不能替换?
Private Sub Tihuan(TfilePath As String, Oldstr As String, Newstr As String)
Dim k As String, s As String
Open TfilePath For Input As #1
Do While Not EOF(1) ' 循环至文件尾。
s = Input(1, #1) ' 读入一个字符。
k = k + s
Loop
k = Replace(k, Oldstr, Newstr) '无条件全部替换
Close #1

Open TfilePath For Output As #2
Print #2, k;
Close #2
End Sub
vbman2003 2008-01-21
  • 打赏
  • 举报
回复
你这个情况估计文本本身尾部有个回车符,所以替换文件后会不断增加,如下试试:



Private Sub Tihuan(TfilePath As String,Oldstr As String, Newstr As String)
Dim k() As Byte
Open TfilePath For Binary As #1
ReDim k(FileLen(TfilePath)-1)
Get #1, , k
Close #1

k=Replace( mid(StrConv(k,vbUnicode),1,len(StrConv(k,vbUnicode))-1) _
,Oldstr,Newstr) '无条件全部替换
Open TfilePath For Output As #2
Print #2, k
Close #2
End Sub


'看你的代码完全是字符处理,所以可以这样:
Private Sub Tihuan(TfilePath As String,Oldstr As String, Newstr As String)
Dim s As string
Open TfilePath For Binary As #1
s=space(lof(#1))
Get #1, , s
Close #1

s=Replace(mid(s,1,len(s)-1),Oldstr,Newstr) '无条件全部替换

   Open TfilePath For Output As #2
Print #2, s
Close #2
End Sub


zdingyun 2008-01-21
  • 打赏
  • 举报
回复
我试了下8楼代码可用。
嗷嗷叫的老马 2008-01-21
  • 打赏
  • 举报
回复
。。。。。。。。。。。。
cike_1111 2008-01-21
  • 打赏
  • 举报
回复
那么说应该是 put 了!!

我只记得以前看过的一篇文章 说解决这个问题的 不能用 print ..要哪个记不太清楚..
of123 2008-01-21
  • 打赏
  • 举报
回复
更正:
Open TfilePath For Output As #2
Put #2, 0, k
Close #2
of123 2008-01-21
  • 打赏
  • 举报
回复
试试:

Open TfilePath For Output As #2
Put #2, k
Close #2



Open TfilePath For Output As #2
Print #2, k;
Close #2
ssq119 2008-01-19
  • 打赏
  • 举报
回复
谢谢!
用此法:
k = Replace(StrConv(k, vbUnicode), Oldstr, left(Newstr,len(Newstr)-2)) '无条件全部替换
试过,无效。

我原来的代码运行后在所查找替换的文本文件的最后部分多了些空行,并不是在查找替换处多了空行。
zzyong00 2008-01-19
  • 打赏
  • 举报
回复
你的读写文件的方法很怪,既然只是要进行文本替换,为什么要用二进制读的方式,却又用文本写的方式,
建议你都用文本方式读写,应该可以消除你说的问题,至于为什么,你自己想想吧
caofusheng 2008-01-19
  • 打赏
  • 举报
回复
Newstr中最后有回车换行,去掉后再替换。
这样试试。
k = Replace(StrConv(k, vbUnicode), Oldstr, left(Newstr,len(Newstr)-2)) '无条件全部替换
zdingyun 2008-01-19
  • 打赏
  • 举报
回复
LZ,你的代码写文件后,就多出Chr(10)及Chr(13)
属于文件的换行符
加载更多回复(3)
Lephone Loczlize Plus 1.06 中文注册版是一个本地化工具,主要用于非资源格式的本地化工作,支持的种类包括非资源格式的 C 编译的程序中的 ASCII 字符串和 UniCode 字符串、非资源格式的 Delphi(C++ Builder)编译的程序的字符串、VB 编译的程序的字符串、文本格式的字符串等的提取及替换。同时它还拥有方便的版本升级功能、字典处理功能,使您在翻译新版本时事半功倍。本软件提供英文、简体中文和繁体中文三种语言选择,并且您也可以很方便的添加对其它语言的支持。 Win98/Me/2000/XP/Vista 可以直接运行本软件,Win95/NT4 需要安装 VB6 运行库。你可以在微软的站点下载它。 本软件主要用于非资源格式的本地化工作,对于资源格式的本地化工作,虽然也可以使用本工具处理,但因为无法做到大于源字串的替换,所以推荐使用其它一些工具(如 Visual C++、ResHacker 等)处理。 本软件的每一个界面上都有一段说明,在使用其功能之前,请先阅读这些说明。 对于所有的功能,其中所说的“对照文件”和“字典文件”都忽略空行,所以可以随意添加空行,不过只有空格的行不被视为空行,而“对照文件”中的其它行以如下格式重复: 偏移量:源字串 修改后的字串 “偏移量”用十进制表示,一般应由程序自行填写,用户不要再做修改;“源字串”也一样由程序自行填写,用户也不要再做修改。 而“字典文件”中的其它行以如下格式重复: 源字串 修改后的字串 同样的,“源字串”也由程序自行填写,用户不要再做修改。 另外,所有对可执行文件进行的替换工作,都不能进行长于源字串的替换,如果修改后的字串长于源字串,本程序将自动剪裁以便和源字串长度相同。如果短于源字串,将会以十六进制数“00”或空格(在“替换字串”界面上选择“多余补空格”)填充空余。 对于 VB 和 Delphi 编译的程序,因为有字串长度计数器,所以使用其专用功能不仅能提高查找的准确性,而且替换后的程序的兼容性也会更好,故推荐对于它们使用其专用的查找替换功能。 本工具约定,VB 格式的 UniCode 的对照文件的扩展名是“.txt”,Delphi 格式的 ASCII 对照文件的扩展名是“.d.txt”, UniCode 格式的对照文件的扩展名是“.u.txt”,而 ASCII 格式的对照文件的扩展名是“.a.txt”。这四种对照文件的格式完全相同。程序会根据所选文件名判断它的类型,虽然用户仍然可以更改类型,不过还是建议使用约定的扩展名。 因为本程序在替换的时候做源字串的检测,所以选错类型一般不会造成不可挽回的后果,不过还是慎重为好。 对于 UniCode 和 ASCII 的查找,并没有前缀作为判断标志,所以如果一个字串的实际长度大于所选的最大长度,则采取右截取的方式。比如实际字串“Text”,而最大长度选择“3”,则提取此字串为“ext”。 对于内含回车换行的字串,使用替换方式进行处理,如下: 对于内含回车换行的字串,使用替换方式进行处理,如下: 回车 替换成 \r 换行 替换成 \n \ 替换成 \\ ” 替换成 \” Tab 替换成 \t “翻译新版本”时,既可以使用“字典文件”,也可以使用“对照文件”。而“对照文件”可以使用“偏移量方式”的“分割对照文件”功能得到“字典文件”。 本程序查找时没有进度条指示进度,不过用户可以预估查找时间。在 P200 上的测试数据如下:查找 UniCode (包括 VB)的速度是 1MB/s ,而查找 ASCII (包括 Delhpi)的速度是 0.5MB/s 。 对于“清除预定义项”,用户可以自行修改其同目录下的“PDef.dat”文件。而对于它,可以使用“翻译项方式”的分割方式分割对照文件,把得到的“.2”文件中想添加的项加入“PDef.dat”即可。不过就我的测试而言,“清除预定义项”的功能对于不特定软件的效果并不是很显著,当然了,对于特定的软件(把不需要的项加入了“PDef.dat”的)效果还是不错的。 对于 INI 文件需要注意的是,程序只把第一个字符是“;”的行作为注释,如果有如“属性=值;注释”这样的行,将把“值;注释”当作“值”处理。 繁简用语替换时,如果用户的使用界面是简体中文,则使用 GBK 内码,如果用户的使用界面是繁体中文,则使用 BIG5 内码,分别对应不同的字典文件,如果本软件提供的词汇量不够的话,可以自行添加。此功能不进行内码转换,所以如果需要转换内码的话,请配合使用其它软件。在字典中请尽量使用长的词汇,这样可以增加准确性。我测得的替换速度约为 50KB/s (字典文件过大时也会对速度造成影响)。
RAR 是一个让你在命令行模式中管理压缩文件的控制台应用。RAR 提供压缩、加 密、数据恢复和许多其它此手册中描述的其它功能。 RAR 只支持 RAR 格式压缩文件,它默认有 .rar 扩展名。不支持ZIP 和其他格 式。即使创建压缩文件时指定了 .zip 扩展名,它仍然是 RAR 格式的。Windows 用户 可以 WinRAR,它支持更多的压缩文件类型,包括 RAR 和 ZIP 格式。 WinRAR 提供了图形用户界面和命令行模式。虽然控制台 RAR 和图形界面 WinRAR 有相似的命令行语法,但是它们还有有一些不同。所以推荐使用此 rar.txt 手册用于 控制台 RAR(rar.exe 在 Windows 版本的情况下),winrar.chm 是图形界面 WinRAR (winrar.exe) 的帮助文件。 配置文件 ~~~~~~~~ Unix 版本的 RAR 从用户的 home 或 /etc 目录中的 .rarrc 文件读取配置文件信息 (存储在 HOME 环境变量中) Windows 的版本 RAR 从 rar.ini 文件读取配置文件信息,它放在 rar.exe 文件相 同的目录中。 这个文件包含下列字符串: switches=任何 RAR 开关,用空格分开 例如: switches=-m5 -s 环境变量 ~~~~~~~~ 可以通过建立"RAR"环境变量来添加默认参数到命令行中. 例如,在 Unix 中,下列命令行可以被添加到你的配置中: RAR='-s -md1024' export RAR RAR 将使用这个字符串作为命令行的默认参数,并将使用 1024KB 字典大小来创建 “固实”压缩文件。 RAR 控制选项使用下列优先级: 命名行开关 最高优先级 在 RAR 变量中的开关 低优先级 保存在配置文件中的开关 最低优先级 日志文件 ~~~~~~~~ 如果在命令行或配置文件中指定开关 -ilog ,RAR 将会把处理压缩文件中遇到的错误 等写到日志文件中。读取开关 -ilog 描述获得更多信息。 固实压缩的文件列表 - rarfiles.lst ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rarfiles.lst 包含一个用户定义的文件列表,告诉 RAR 添加文件到固实压缩文件时的顺 序。它可以包含文件名通配符和指定项目 -$default。默认项目定义了这个文件中与 其他项目不相符时的顺序清单位置。 注释字符是 ';'. 在 Windows 中,这个文件应该放在 RAR 所在的或 %APPDATA%\WinRAR 目录中, 在 Unix 中- 放在用户的 home 目录或在 /etc 中。 提高压缩率和操作速度的提示: - 在压缩文件中,小文件应该被组织在一起; - 频繁被处理的文件应该放在开始的位置。 普通的掩码越靠近顶端优先权就越高,但是这个规则存在例外。如果 rarfiles.lst 包含两个掩码,并且所有文件既匹配第一个掩码,也匹配第二个掩码, 较小的子集 或者更精确的匹配拥有更高的优先权。例如,如果你用 *.cpp 和 f*.cpp 掩码, f*.cpp 拥有更高的优先权。 RAR 命令行语法 ~~~~~~~~~~~~~~ 语法 RAR [ - ] [ ] [ ] [ ] 描述 命令行选项 (命令和开关) 提供了使用 RAR 创建和管理压缩文件的控制方法。命 令是一个字符串(或单个的字母),命令 RAR 去执行一个相应的操作。开关被用来 改变 RAR 执行操作的方法。其它参数是压缩文件名和被压缩的文件或要从压缩文件 中被解压文件。 列表文件是一个包括处理的文件名的纯文本文件。第一列应该以文件名开始。可以 在//字符后添加注释。例如,你可以创建包含下列字符串的 backup.lst: c:\work\doc\*.txt //备份文本文档 c:\work\image\*.bmp //备份图片 c:\

7,785

社区成员

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

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