如何快速删除文本文件包含指定关键字的行?

jwing 2008-02-16 03:05:49
我是通过将文本文件的每行读入数组,然后进行比较,将不包含特定关键字的行写入新文件,但执行效率很差,有什么好的方法提高效率?

Dim FN%, strFileName$
Dim S() As String
Dim j&
Private Sub cmdStart_Click()
Dim sFile$
Dim i%
FN = FreeFile
strFileName = Dir(App.Path & "\log\log*.txt", vbNormal)
Do While strFileName <> ""
List1.AddItem strFileName
strFileName = Dir
Erase S
Trans App.Path & "\log\" & strFileName

FN = FreeFile
Open App.Path & "\log\" & Left(strFileName, Len(strFileName) - 4) & "_OK.txt" For Output As #FN
For i = 0 To UBound(S)
If InStr(S(i), "股票") Then
j = j + 1
Else
Print #FN, S(i)
DoEvents
' List1.AddItem S(i)
End If
Next
Close #FN
Loop

List1.TopIndex = List1.ListCount - 1
End Sub

Sub Trans(strFile As String)
Dim i&
Dim strLine$
Dim s1$
FN = FreeFile
Open strFile For Input As #FN
Do While Not EOF(F)
Line Input #FN, strLine
s1 = s1 & strLine & vbCrLf
Loop
Close #FN
S = Split(s1, vbCrLf)
End Sub
...全文
3282 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
toyer1 2010-01-21
  • 打赏
  • 举报
回复
哈哈。。。。。。
可西哥 2008-03-07
  • 打赏
  • 举报
回复
我倒! 最后写的那么好的代码竟然没有分!

前面垃圾代码倒得了5分!
jwing 2008-02-29
  • 打赏
  • 举报
回复
问题解决了,结帖了,呵呵!
jwing 2008-02-27
  • 打赏
  • 举报
回复
呵呵,这个肯定,但近来很忙,没有时间测试xmxoxo的修改后的程序,测试完毕最结帖,在此先多谢有这么多热心人帮助!
嗷嗷叫的老马 2008-02-26
  • 打赏
  • 举报
回复
解决了记得结帖......
可西哥 2008-02-23
  • 打赏
  • 举报
回复
查了,仅是算法一在删除整行时留下了一个OA,所以字节数和行数就大了
另外算法二最后一行没有复制,同时大小多了一个字节.

程序已更新.
可西哥 2008-02-23
  • 打赏
  • 举报
回复
算法一的正则没有包含换行符,所以行还在.

算法二的偶查查.
jwing 2008-02-21
  • 打赏
  • 举报
回复
算法一 处理用时 4703ms
算法二 21579ms
jwing 2008-02-21
  • 打赏
  • 举报
回复
xmxoxo 代码在我机上测试有问题。
文件 大小 行数 备注
test 55090393 325011 原文件
test1 55090376 325011 用算法一的输出文件
test2 54675233 322246 用算法二的输出文件

原文件只有第一行含有关键字,test1只将关键字替换成“”并没有将行删除;test2虽将关键字行删除了,但也莫名的删除了2765行

请xmxoxo检查下代码是否有问题!!!
可西哥 2008-02-20
  • 打赏
  • 举报
回复
上次那个没完全修改完,
现在改完了:


程序下载: http://hexi5.com/bbs/viewFile.asp?BoardID=6&ID=98

源码下载: http://hexi5.com/bbs/viewFile.asp?BoardID=6&ID=99

相关贴子: http://www.hexi5.com/bbs/dispbbs.asp?boardid=6&id=215&star=1&page=1
zzyong00 2008-02-20
  • 打赏
  • 举报
回复
楼上的,你哪没有源码!如何讨论算法?
可西哥 2008-02-20
  • 打赏
  • 举报
回复
新算法,直接用数组而不用字串
程序下载: http://www.hexi5.com/bbs/viewFile.asp?BoardID=6&ID=95


测试文件: 75,024,060 字节

相关贴子: http://www.hexi5.com/bbs/dispbbs.asp?boardid=6&id=215&star=1&page=1
用户 昵称 2008-02-19
  • 打赏
  • 举报
回复
Option Explicit

Dim s() As String
Dim FN As Integer

Sub Trans(strFile As String)
Dim s1 As String
FN = FreeFile
Open strFile For Binary As FN
s1 = Space(LOF(FN))
Get FN, , s1
Close #FN
s = Split(s1, vbCrLf)
End Sub

Private Sub Command1_Click()
Dim outbuffer As String
Dim i As Long

Trans "d:\a.txt"
For i = 0 To UBound(s)
If InStr(1, s(i), "娃娃", vbTextCompare) > 0 Then '整个比较过程是在内存里完成的,速度上会快很多.
s(i) = ""
Else
s(i) = s(i) & vbCrLf
End If
Next i
outbuffer = Join(s, "")
Open "d:\b.txt" For Binary As #2 '二进制写入.
Put #2, , outbuffer
Close #2

MsgBox "ok"
End Sub


只对vb中基本语句了解,不知道前面的变量声明的是否对了,我6兆数据全是0了。
jwing 2008-02-19
  • 打赏
  • 举报
回复
jennyvenus :

贴出你的代码,我测试一个70M的大文件时显示 “字符串空间溢出”
put #FN,,join(stmp,vbcrlf) 就是这行
用户 昵称 2008-02-19
  • 打赏
  • 举报
回复
俺的测试文件是40兆
用户 昵称 2008-02-19
  • 打赏
  • 举报
回复
楼主试一个大文件,俺测试在俺的机器上,6兆以后的数据没有了。
mimong_lin 2008-02-19
  • 打赏
  • 举报
回复
学习学习.
jwing 2008-02-18
  • 打赏
  • 举报
回复
已下载xmxoxo的示例程序,学习中……
jwing 2008-02-18
  • 打赏
  • 举报
回复
如数据量不是很大,用jennyvenus的代码就可以应付了,如果要求稍高点用xmxoxo 的正则表达式,可能更好!
嗷嗷叫的老马 2008-02-18
  • 打赏
  • 举报
回复
真想不通~~~

为什么会有这么大的差别呢?
加载更多回复(32)

7,762

社区成员

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

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