一个文本文件中一大段文本的删除或者替换,请问用批处理或者vb或者delphi如何编写?

多个感染了病毒的mnl文件,是文本格式。我要删除最后面病毒添加的内容。以(defuns::startup为开头,jjyy为结尾,中间部分清除,大概有30行左右,请问用vb... 多个感染了病毒的mnl文件,是文本格式。我要删除最后面病毒添加的内容。
以(defun s::startup 为开头,

jjyy为结尾,中间部分清除,大概有30行左右,请问用vb或者delphi有什么思路?
展开
 我来答
独落长秋
2011-04-09 · TA获得超过1535个赞
知道小有建树答主
回答量:606
采纳率:0%
帮助的人:684万
展开全部
delphi应该简单点吧?
vb没接触过,delphi也没,但写这种程序,delphi作为rad工具应该快些。
先遍历文件,找出后缀名为mnl的文件,读取。delphi的memo可以用来读取,然后在memo内处理,应该简单得多,或者直接读出来,写一个函数,一个一个字符的读,非删除内容就存到别一个字符串内,要删除的内容则不管。(读到d的时候,看下一个是不是e,下下个是不是e……如果读到开头内容了,然后就直接去找结尾内容,中间的不管。)最后return 一下。

删除内容应该简单,是字符串的处理,难点的应该是遍历吧,这个网上应该有的,翻一下就得了。
lidajiangzw
2011-04-10 · TA获得超过903个赞
知道小有建树答主
回答量:774
采纳率:0%
帮助的人:717万
展开全部
用正则表达式匹配找到 (defun s::startup 为开头 ,jyy为结尾的字符串,然后替换掉就行了,
可以用 vbs 脚本语言的正则表达式对象,
我下面是 vb6 代码,如果需要 改成 vbs 脚本即可

Private Sub Form_Load()
fn = "d:\我的文档\桌面\1.txt" '要处理的完整文件名
newfn = "d:\我的文档\桌面\2.txt" '处理后保存的文件名路径

Set fso = CreateObject("scripting.filesystemobject")
Set f = fso.opentextfile(fn, , 1)
If Not f.atendofstream Then alltxt = f.readall
f.Close
Set re = CreateObject("VBScript.RegExp")
re.IgnoreCase = false
re.Global = True
re.Pattern = "((?:.|\n)*)\(defun s::startup(?:.|\n)*?jjyy((?:.|\n)*)"
Set ma = re.Execute(alltxt)
MsgBox ma.Count
If ma.Count = 0 Then End
Set f = fso.opentextfile(newfn, 2, 1)
f.write ma(0).submatches(0) & ma(0).submatches(1)
f.Close
End Sub
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yyykkkyyyy
2011-04-10 · TA获得超过3136个赞
知道大有可为答主
回答量:2691
采纳率:40%
帮助的人:3308万
展开全部
写个批处理
把要处理的文件放一个文件夹里,批处理也要放这个文件夹里
@echo off&setlocal enabledelayedexpansion
set "str1=defun s::startup"
set "str2=jjyy"
echo/&echo 正在处理:
for /f "delims=" %%x in ('dir/b *.mnl')do (echo. %%x
if exist "%%x.tem" del "%%x.tem"
set f=&set n1=&set n2=&set fn=%%x&call :fun1
if not defined f (set/a m+=1
for /f "tokens=1* delims=:" %%i in ('findstr/n ".*" "%%x"')do (
set hn=%%i&set "hs=%%j"&call :fun2
))
move "!fn!.tem" "%%x")
echo/
if defined m (echo 共处理 %m% 个文件)else echo 未发现需要处理文件
pause
exit/b
:fun1
for /f "delims=:" %%a in ('findstr/nc:"%str1%" "%fn%"')do set n1=%%a
if not defined n1 (set f=y)else (set/a "n1b=n1-1"
for /f "delims=:" %%b in ('findstr/n "%str2%" "%fn%"')do (
if %%b geq !n1! set n2=%%b))
if not defined n2 set f=y
goto :eof
:fun2
(if %hn% lss %n1% echo.%hs%
if %hn% equ %n1% (set ths=!hs:%str1%=ゅ!
set ths1=!ths:*ゅ=!&call set ths1=%%ths:ゅ!ths1!=%%
set/p=!ths1!<nul&if %n1% neq %n2% echo.)
set "ths2="
if %hn% equ %n2% (set ths=!hs:%str2%=ゅ!
set ths2=!ths:*ゅ=!
if defined ths2 echo.!ths2!)
if %hn% gtr %n2% echo.%hs%)>>"%fn%.tem"
goto :eof
追问
执行了批处理没有任何反应。
我想问一下if %hn% equ %n2% (set ths=!hs:%str2%=ゅ!
最后的那个奇怪字符ゅ! 是什么意思,能每段解释一下么?
追答
我是测试过的,如果你按要求执行不了,把你的样文贴几行我看,也许有特殊字符在里面,有针对性地写命令或许是可解决的
至于那个怪字符是要找一个估计你的文本里没有的单字符来替换字符串,便于处理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沙慧月03
2011-04-10 · TA获得超过2157个赞
知道大有可为答主
回答量:2717
采纳率:100%
帮助的人:3629万
展开全部
我这个可以实现批量替换,自动更新文件
我用vb6编的,加一个按钮,及file控件

假设操作目录为d:\1\ 也就是存放mnl文件的地方

效果:
修改前:
123456
36589888defun s::startup欢度佳节
xxxxxxx
xjjyy123586
修改后:
123456
36589888defun s::startup
jjyy123586

代码
Private Sub Command1_Click()
For i = 0 To File1.ListCount - 1
Open File1.Path & "\" & File1.List(i) For Input As #1
Open "d:\temp.mnl" For Output As #2
Do Until EOF(1)
Line Input #1, a
b = InStr(1, a, "defun s::startup")
If b = 0 Then
Print #2, a
Else
Print #2, Mid(a, 1, b + 16)
Do Until EOF(1)
Line Input #1, a
b = InStr(1, a, "jjyy")
If b <> 0 Then
Print #2, Mid(a, b)
Do Until EOF(1)
Line Input #1, a
Print #2, a
Loop
End If
Loop
End If
Loop
Close
Close
Kill File1.Path & "\" & File1.List(i)
Name "d:\temp.mnl" As File1.Path & "\" & File1.List(i)
Next
msgbox "替换完毕"
End Sub

Private Sub Form_Load()
File1.Path = "d:\1\"
End Sub
追问
这个比较类似,但是我有很多不明白的地方,能否逐段落做一下简单的说明?
例如Print #2, Mid(a, 1, b + 16)是把过滤出来的字符写入临时文件但是b+16代表什么?
Print #2, Mid(a, b)又是什么意思呢?
追答
Private Sub Command1_Click()
For i = 0 To File1.ListCount - 1 从第一个文件开始到完
Open File1.Path & "\" & File1.List(i) For Input As #1 打开操作文件
Open "d:\temp.mnl" For Output As #2 新建一个临时文件
Do Until EOF(1) 循环读取操作文件
Line Input #1, a 读取操作文件
b = InStr(1, a, "defun s::startup") 寻找刚读取的内容中是否有defun s::startup
If b = 0 Then 如果找不到
Print #2, a 将刚读取的内容写入临时文件
Else 如果找到
Print #2, Mid(a, 1, b + 16) 从刚读取的内容第一个字符开始,取b+16个字符,b指defun s::startup 的d所在的位置,16指defun s::startup的长度,若没加16,则defun s::startup没有写入临时文件
Do Until EOF(1) 循环至文件完
Line Input #1, a 读取文档
b = InStr(1, a, "jjyy") 查询刚读取的内容是否有 jjyy
If b 0 Then 如果有
Print #2, Mid(a, b) 从刚读取的内容的第b个字符开始写入临时文件,b指jjyy中第一个j所在的位置
Do Until EOF(1) 循环
Line Input #1, a 将剩余的内容无条件写入临时文件
Print #2, a
Loop
End If
Loop
End If
Loop
Close 关闭操作文件
Close 关闭临时文件
Kill File1.Path & "\" & File1.List(i) 删除操作文件
Name "d:\temp.mnl" As File1.Path & "\" & File1.List(i) 将临时文件改名操作文件的名字
Next
msgbox "替换完毕" 完毕后,弹出提示
End Sub

Private Sub Form_Load()
File1.Path = "d:\1\" 定义操作文件所在文件夹为d:\1\
End Sub
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ztw1122
2011-04-10 · TA获得超过1088个赞
知道小有建树答主
回答量:2382
采纳率:80%
帮助的人:950万
展开全部
用VB 简单些,弄个数组,把读出来的东西读到(defun s::startup前为止,然后用OUTPUT写回去,原来的就全覆盖了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式