CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

请问怎么可以快速计算出一个文本文件的行数

楼主xixiaoma(小马)2006-06-23 12:02:30 在 VB / 基础类 提问

大家能不能给出一下代码,我的文本文件有几十万行  
  问题点数: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

相关问题

关键词

得分解答快速导航

  • 帖主:xixiaoma
  • faysky2

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo