请问怎么可以快速计算出一个文本文件的行数
大家能不能给出一下代码,我的文本文件有几十万行
问题点数:100、回复次数:23Top
1 楼DengXingJie(杰西)回复于 2006-06-23 12:09:45 得分 0
用ADO連接的方法求得Top
2 楼DengXingJie(杰西)回复于 2006-06-23 12:11:24 得分 0
Cn.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=F:\;Extensions=asc,csv,tab,txt;"
Cn.Open
Dim Rst As New ADODB.Recordset
Dim Sql As String
Sql = "select * from TEST.txt"
Rst.CursorLocation = adUseClient
Rst.Open Sql, Cn, adOpenStatic, adLockPessimistic
行數=rst.RecordCount+1Top
3 楼DengXingJie(杰西)回复于 2006-06-23 12:12:52 得分 0
自己可以去優化一下SQL語句
如:select count(*) as rows from text.txtTop
4 楼faysky2(出来混,迟早是要还嘀)回复于 2006-06-23 12:13:44 得分 100
MsgBox CreateObject("scripting.FileSystemObject").OpenTextFile("c:\test.txt", 8).LineTop
5 楼leongwong()回复于 2006-06-23 12:18:25 得分 0
学习!楼上的faysky2(出来混,迟早是要还嘀) 方法真妙!Top
6 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-23 12:24:16 得分 0
哦天呢,
你可以通过OPEN语句打开文件,然后用行读的办法读一下,并且在其中设置一个变量来计算读了多少行。。。
也就是类似下面代码
Option Explicit
Private Sub Form_Load()
Dim hT1 As Integer, hCount As Integer, hFreeNumber As Integer
Dim tmp As String
hFreeNumber = FreeFile
Open "c:\BOOT.INI" For Input As #hFreeNumber
While Not EOF(hFreeNumber)
Line Input #hFreeNumber, tmp
hCount = hCount + 1
If tmp = "" Then hCount = hCount - 1
Wend
Close #hFreeNumber
MsgBox hCount
End Sub
Top
7 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-06-23 12:28:02 得分 0
不错不错,可是我这个该死的VB怎么搞的,FileSystemObject对象不行了呢。。刚才还试了试。。。非常晕Top
8 楼windindance(风舞轻扬·白首为功名)回复于 2006-06-23 12:45:33 得分 0
用二进制打开文件,扫描字节,遇到#13#10表示增加了一行。这应该是最快的方法。Top
9 楼viena(维也纳N02)回复于 2006-06-23 13:04:39 得分 0
最快的方法来了
Dim lngLineCount As Long'行数
Dim strFileName As String'文件路径
lngLineCount = 1
strFileName = "C:\test.txt"
'缓冲区长度,最佳值根据不同的系统来定
'应该是4096的倍数
Dim lngBufferSize As Long
lngBufferSize = 262144
ReDim abytBuffer(lngBufferSize - 1) As Byte
Dim lngRemain As Long, i As Long
Open strFileName For Binary Access Read As #1
lngRemain = LOF(1)
While lngRemain > 0
If lngRemain < lngBufferSize Then
lngBufferSize = lngRemain
ReDim abytBuffer(lngBufferSize - 1)
End If
Get #1, , abytBuffer
lngRemain = lngRemain - lngBufferSize
For i = 0 To lngBufferSize - 1
If abytBuffer(i) = 13 Then lngLineCount = lngLineCount + 1
Next
Wend
Close #1
Erase abytBuffer
Msgbox "行数是" & lngLineCountTop
10 楼viena(维也纳N02)回复于 2006-06-23 13:06:20 得分 0
以上代码只判断了回车符,没有判断换行符
假定没有单独的回车符存在Top
11 楼tdwy1997(五月飞雪)回复于 2006-06-23 15:50:59 得分 0
那是不是只算一行了???Top
12 楼viena(维也纳N02)回复于 2006-06-23 16:54:29 得分 0
解释下“以上代码只判断了回车符,没有判断换行符
假定没有单独的回车符存在”
微软的文本文件一般是以回车+换行作为行分隔符
如果只有回车符或只有换行符,用记事本打开不换行,显示为黑方框
只判断回车符,就是假设所有换行都是回车+换行连用
如果不是回车+换行连用,判断代码要稍微改动
回车符编码为13,换行符编码为10Top
13 楼viena(维也纳N02)回复于 2006-06-23 16:56:48 得分 0
比如回车换行连用,但包含单独的回车符
比如只用换行符Top
14 楼guoshaoning()回复于 2006-06-23 17:10:44 得分 0
长见识了!学习!Top
15 楼verywzm(寒江雪)回复于 2006-06-23 22:47:54 得分 0
学习!Top
16 楼ly_fly()回复于 2006-06-24 09:44:25 得分 0
学习Top
17 楼hu030152(用程序说话)回复于 2006-06-24 10:05:23 得分 0
学习!~Top
18 楼ccs02287(☆兜兜里有糖☆偶滴兜兜里有糖,你和我玩不?)回复于 2006-06-24 10:21:36 得分 0
学习ING……Top
19 楼verywzm(寒江雪)回复于 2006-06-24 11:55:26 得分 0
根据我的测试,viena(维也纳nn [IQ=50,EQ<0]) 大哥,你的方法不是很快,我用一个80M的字典(有1000多万行)测试,你的方法要13秒左右,而faysky2(出来混,迟早是要还嘀)大哥的方法只要5秒。Top
20 楼cuizm(射天狼 http://www.j2soft.cn/)回复于 2006-06-24 16:35:06 得分 0
给你一个不用引用外部控件,并且速度很快的方法,我没有大文件,你可试一下。
Private Sub Command1_Click()
Dim strTmp As String, arrTmp As Variant
Open "D:\临时目录\新建 文本文档.txt" For Input As #1
strTmp = StrConv(InputB$(LOF(1), 1), vbUnicode)
Close #1
arrTmp = Split(strTmp, vbCrLf)
MsgBox "文件行数:" & UBound(arrTmp)
End Sub
╭═══════════════════╮
║ 免费的源码、工具网站,欢迎大家访问!║
║ http://www.j2soft.cn/ ║
╰═══════════════════╯Top
21 楼viena(维也纳N02)回复于 2006-06-26 08:42:43 得分 0
楼上,这个方法是最慢的
详见
http://community.csdn.net/Expert/topic/4825/4825949.xmlTop
22 楼viena(维也纳N02)回复于 2006-06-26 08:50:28 得分 0
按理说我的方法应该是最快的,但具体情况不同也会影响测试结果的
比如CPU速度、内存速度、磁盘访问速度以及缓冲区的大小,
测试文件是否有很多很短的行组成等等
不知道FSO内部是怎么实现的~Top
23 楼windindance(风舞轻扬·白首为功名)回复于 2006-06-26 08:57:34 得分 0
理论上viena的方法应该是最快的,影响性能的地方可能出在:
缓冲区的大小,以及VB语言实现的问题吧?Top




