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

多个感染了病毒的mnl文件,是文本格式。我要删除最后面病毒添加的内容。
以(defun s::startup 为开头,

jjyy为结尾,中间部分清除,大概有30行左右,请问用vb或者delphi有什么思路?

delphi应该简单点吧?
vb没接触过,delphi也没,但写这种程序,delphi作为rad工具应该快些。
先遍历文件,找出后缀名为mnl的文件,读取。delphi的memo可以用来读取,然后在memo内处理,应该简单得多,或者直接读出来,写一个函数,一个一个字符的读,非删除内容就存到别一个字符串内,要删除的内容则不管。(读到d的时候,看下一个是不是e,下下个是不是e……如果读到开头内容了,然后就直接去找结尾内容,中间的不管。)最后return 一下。

删除内容应该简单,是字符串的处理,难点的应该是遍历吧,这个网上应该有的,翻一下就得了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-10
用正则表达式匹配找到 (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
第2个回答  2011-04-10
写个批处理
把要处理的文件放一个文件夹里,批处理也要放这个文件夹里
@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%=ゅ!
最后的那个奇怪字符ゅ! 是什么意思,能每段解释一下么?

追答

我是测试过的,如果你按要求执行不了,把你的样文贴几行我看,也许有特殊字符在里面,有针对性地写命令或许是可解决的
至于那个怪字符是要找一个估计你的文本里没有的单字符来替换字符串,便于处理

第3个回答  2011-04-10
我这个可以实现批量替换,自动更新文件
我用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

本回答被提问者采纳
第4个回答  2011-04-10
用VB 简单些,弄个数组,把读出来的东西读到(defun s::startup前为止,然后用OUTPUT写回去,原来的就全覆盖了。

一个文本文件中一大段文本的删除或者替换,请问用批处理或者vb或者delph...
vb没接触过,delphi也没,但写这种程序,delphi作为rad工具应该快些。先遍历文件,找出后缀名为mnl的文件,读取。delphi的memo可以用来读取,然后在memo内处理,应该简单得多,或者直接读出来,写一个函数,一个一个字符的读,非删除内容就存到别一个字符串内,要删除的内容则不管。(读到d的时候,看...

求能将txt文件中的字符进行替换的批处理
把代码中的xxxxx换为你想要插入的字符,空格也行,tab键也行。新的文件在tmp文件夹里,运行完后会自动打开。echo off&md tmp for \/f "delims=" %%a in ('dir\/b *.txt') do (for \/f "delims=" %%i in ('type "%%a"') do (set "var=%%i"setlocal enabledelayedexpansion echo !var:~...

delphi读取文本问题
上面这一行语句将会为变量myinifile与具体的文件program.ini建立联 系,然后,就可以通过变量myinifile,来读写program.ini文件中的关 键字的值了。 值得注意的是,如果括号中的文件名没有指明路径的话,那么这个 Program.ini文件会存储在Windows目录中,把Program.ini文件存储在应 用程序当前目录中的方法是:为其指定完...

vb或asp 调用 delphi制作的dll 问题
1、标准DLL(即带有若干导出函数的DLL)2、ActiveX DLL(带有若干COM接口的DLL)。前者在VB中使用Declare 语句声明过程然后在使用的地方调用。后者在VB中要先引用(Import),然后声明并实例化一个COM类来实现使用;或者使用CreateObject来创建COM实例。ASP用的VBS实际上是简化后的VB,只能使用后者即ActiveX...

如何用delphi向一个网页的文本框发送字符?
还不支持中文。你可以到google上搜索delphi sendkey就可以找到很多前辈们自己写的类似VB的senkey 函数,很好用。要是找不到的话,用KEYEVENT也可以代替,属于模拟键盘填写但是效果不好。其实很多时候不需要用sendkey之类的函数,除非你需要填写类似QQ申请页面,否则用字段.value赋值也可以。

delphi中VBspcript_TRegExp类(正则表达式)怎么用
这个vb script Regular Expression 5.5对象是IE5.5自带的,所以很方便引用。首先介绍一下这个对象 只要你的服务器安装了IE5.x,就会带VBscript5.5。其实,“正则表达式”原本是Unix下面的专利,尤其是在Perl语言中使用的最为广泛,正是由于“正则表达式”的强大功能,才使得微软慢慢将正则表达式对象移植到了视窗系统上面,利用...

程序设计中的指令是什么?有哪几种?
程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。ASP和JSP都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。 ASP的编程语言是VBScript之类的脚本语言,JSP使用的是Java,这是两者最明显的区别。 此外,ASP与JSP还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的...

请问DELPHI和VC有什么区别?除了语言上的.
似乎VC是"让框架迁就语言",而Delphi是"让语言迁就框架"。 我想举一个对字符串操作的封装的例子来说明MFC和VCL的优缺点。在MFC中,CStringList类有加入、获取、删除等功能,但VCL的TStringList类除了上述功能还有排序、从逗号分隔的字串读入、流输入输出等功能。但同样的字符串替换功能,VCL的StringReplace要比MFC的...

我有个exe文件,想删除或者隐藏里面的某些控件该怎样弄?
这是一个复杂的问题。如果exe是VC++或Delphi等书写的,试试用 Reshacker 删除某些控件。如果exe是VB编写的,试试DeVB这类反编译软件。如果exe加壳了,先脱壳。

VB中文本框如何换行
首先点“工程”,“部件”,找到“Microsoft Rich textbox Contral 6.0”勾上,点“确定”,然后就可以在工具那里看到它了,在窗体上画RichTextBox1 RichTextBox1 就不用设置MultiLine了,代码的写法和用Text4差不多 复制下边的代码:Private Sub Form_Load()RichTextBox1 = ""End Sub Private ...

相似回答