如何用VB读取一个文本文件的指定行内容

new_dream 2003-03-27 12:14:24
对一个很大的文本文件,怎样读取指定行数的文本内容以及取得总行数。

对许多人来说,这是个简单问题,还请高手们不吝赐教。

请给出例子,谢谢!
...全文
2860 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
new_dream 2003-03-31
  • 打赏
  • 举报
回复
谢谢各位的参与!
用line input 遍历的方法我以前就用过,但是遇到很大的文件效率不高。
我觉得northwolves(野性的呼唤)和lihonggen0(李洪根,用.NET,标准答案来了)的第一种办法很好。
也谢谢 jessezappy(晶晶)的帮助!
northwolves 2003-03-27
  • 打赏
  • 举报
回复
Function lines(txtpath As String, ByVal startline As Integer, linenum As Integer) As String '显示 txtpath 文件的从startline 行开始的 linenum 行的内容
lines = ""
Dim filetxt As String, x As Variant, i As Integer
filetxt = String(FileLen(txtpath), " ")
Open txtpath For Binary As 1
Get #1, , filetxt
Close 1
x = Split(filetxt, vbCrLf)
msgbox ubound(x)+1 '行数
If startline > UBound(x) Then MsgBox "行溢出", 64, "err!": Exit Function
If startline <= UBound(x) Then
If startline + linenum <= UBound(x) Then
For i = startline To startline + linenum - 1
lines = lines & x(i) & " "
Next
Else
For i = startline To UBound(x)
lines = lines & x(i) & " "
Next
End If: End If

End Function
lihonggen0 2003-03-27
  • 打赏
  • 举报
回复
以下是实现你需要的功能的代码
引用microsoft script runtime




Private Function ReadFileLine(cfile As String, cLine As Integer) As String
Dim I As Integer
Dim fsoTest As New FileSystemObject, file1 As File, ts As TextStream
Set file1 = fsoTest.GetFile(cfile)
Set ts = file1.OpenAsTextStream(ForReading)
I = 1
Do While Not ts.AtEndOfStream
If I <> cLine Then
ts.ReadLine
Else
ReadFileLine = ts.ReadLine
End If
I = I + 1
Loop
MsgBox "总行数" & I
Set ts = Nothing

End Function

Private Sub Form_Load()
MsgBox "读取行的内容为:" & (ReadFileLine("f:\test.txt", 3))

End Sub




------------------------------------------------------------------
个人专栏:http://www.csdn.net/develop/author/netauthor/lihonggen0/
------------------------------------------------------------------
lihonggen0 2003-03-27
  • 打赏
  • 举报
回复
二、sendmessage函数使用实例
例1 多行textbox中的快速处理功能在处理多行textbox时我们经常会碰到以下几种情况:
希望了解多行textbox中目前共有多少行文字。
想快速返回第n行的文字。
对于上面的情况,如果用vb自身的语句或函数来实现的话,要写不短的代码,而且由于要采用顺序查找的办法来完成,因此代码的执行效率也很低。如果使用sendmessage函数则可以大大减少代码量,并大幅度的提高执行效率。
用sendmessage函数完成上面两个任务的方法非常简单,每个任务只需简单地发送一条消息给多行textbox即可,两个消息分别为:em_getlinecount、em_getline,其它参数和返回值见附表。
下面用一个简单的实例演示这两个功能:
新建工程,在form1上添加三个textbox(名称分别为text1、txtlinecount、txtstring,将text1的multi
line属性置为true)、三个标签和一个命令按钮。为工程添加一个模块moudle1,在其中写如下声明(其中
sendmessage函数的声明可以从vb的“api浏览器”中复制): 消息常量名 消息值 wparam lparam 返回值
em_getlinecount &hba 未用 未用 行数
em_getline &hc4 要找的行号 存结果的字节串 结果字节串的字节数

declare function sendmessage lib "user32" alias "sendmessagea" (byval hwnd as long, byval wmsg as long, byval wparam as long,lparam as any) as long
public const em_getlinecount=&hba
public const em_getline=&hc4
在form1的代码模块中写如下代码:
private sub command1_click()
dim str(256) as byte
str(1)=1 '最大允许存放256个字符
'获取总行数,结果显示在文本框txtlinecount中
txtlinecount=sendmessage(text1.hwnd,em_getlinecount,0,0)
'获取第3行的数据放在str中,转换为字符串后显示在文本框txtstring中
sendmessage text1.hwnd,em_getline,2,str(0)
txtstring= strconv(str,vbunicode)
end sub
之后,按f5运行程序,在多行文本框中随便键入几行文字,然后按下[确定]按钮。

vansoft 2003-03-27
  • 打赏
  • 举报
回复
最好还是用API函数
用户 昵称 2003-03-27
  • 打赏
  • 举报
回复
要看这个很大的具体情况,小于64k的可以一次性读入文本框,然后用
sendmessage
EM_GETLINECOUNT

EM_GETLINE
解决

超过64k的话不如用数据库
jessezappy 2003-03-27
  • 打赏
  • 举报
回复
我是用 Line Input 语句来实现的。
你用 DO 循环 加 eof(#n) 再来个计数变量就可以很好的的控制读取固定的行,一次整行读入。这样的代码很简单!:

'打开文件 c:\Escreps.prn
Open "c:\Escreps.prn" For Input As #1
'取文件内容,这种是知道文件的固定行数
For i = 1 To 24
Line Input #1, temp
Select Case i
Case 8 '例如要处理第8行
'在这里可以处理 TEMP 读取的内容
End Select
Next i
Close #1


'*-----------------不知道文件总行数的时候用这种办法。
Do While Not EOF(1)
'------------取文件内容
Line Input #10, DateSr
i=i+1
Select Case i '这个你也可以用其他判断语句。
Case 8 '例如要处理第8行
'在这里可以处理 TEMP 读取的内容
End Select
LOOP

'*-------------------上面的代码是不是很简单。。?这是我现在在用的两种形式。一种知道文件总行数,另一种不知道总行数。很方便。
不过上面 northwolves兄的办法也值得学习。
gang75 2003-03-27
  • 打赏
  • 举报
回复
up

7,763

社区成员

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

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