VB如何读取大的文本文件
我有一个大的文本文件,现在要对它读取并处理。但是我遇到这样一个问题:我单把读取文件的代码拿出来,做试验使用PrivateSubCommand1_Click()DimiAs...
我有一个大的文本文件,现在要对它读取并处理。
但是我遇到这样一个问题:
我单把读取文件的代码拿出来,做试验使用
Private Sub Command1_Click()
Dim i As Integer
i = 0
Dim linestr As String
Print "开始读取文件。。。"
Open FilePath1 For Input As #1
Print "打开成功"
Do While i < 2
Line Input #1, linestr
i = i + 1
Loop
Print "ok"
End Sub
运行这个东西,就会显示“开始读取文件。。。。” 然后就没反应了。
卡住了,等了半个小时都没有用。
但是
我将代码删点东西 不运行line input
Private Sub Command1_Click()
Dim i As Integer
i = 0
Dim linestr As String
Print "开始读取文件。。。"
Open FilePath1 For Input As #1
Print "打开成功"
End Sub
就会显示“开始读取文件。。。。” “打开成功” 。程序运行成功了。
请问问大家这个怎么办,我代码都写好了,就是没考虑到文件居然这么大,现在别说我代码处理部分了,读取都困难。
请大家帮我想一想,有没有方法让他一部分后停下来,让我的LINE INPUT运行一下 然后再读一部分。
或者直接将他写入内存 我内存很大,总之提高读取速度就是了,大家帮帮忙啊。
兄弟 不行啊 加上DoEvents 照样挂了
呵呵 我的文件大的吓人 700多MB,但是文件中已经分行了,一行就10几个字符,所以我要按行读处理。
wqlk1:
你的答案很不错,从你的程序中我收到不少启发,不过还有些不太明白,有QQ吗 展开
但是我遇到这样一个问题:
我单把读取文件的代码拿出来,做试验使用
Private Sub Command1_Click()
Dim i As Integer
i = 0
Dim linestr As String
Print "开始读取文件。。。"
Open FilePath1 For Input As #1
Print "打开成功"
Do While i < 2
Line Input #1, linestr
i = i + 1
Loop
Print "ok"
End Sub
运行这个东西,就会显示“开始读取文件。。。。” 然后就没反应了。
卡住了,等了半个小时都没有用。
但是
我将代码删点东西 不运行line input
Private Sub Command1_Click()
Dim i As Integer
i = 0
Dim linestr As String
Print "开始读取文件。。。"
Open FilePath1 For Input As #1
Print "打开成功"
End Sub
就会显示“开始读取文件。。。。” “打开成功” 。程序运行成功了。
请问问大家这个怎么办,我代码都写好了,就是没考虑到文件居然这么大,现在别说我代码处理部分了,读取都困难。
请大家帮我想一想,有没有方法让他一部分后停下来,让我的LINE INPUT运行一下 然后再读一部分。
或者直接将他写入内存 我内存很大,总之提高读取速度就是了,大家帮帮忙啊。
兄弟 不行啊 加上DoEvents 照样挂了
呵呵 我的文件大的吓人 700多MB,但是文件中已经分行了,一行就10几个字符,所以我要按行读处理。
wqlk1:
你的答案很不错,从你的程序中我收到不少启发,不过还有些不太明白,有QQ吗 展开
10个回答
展开全部
记得好象一般上限是2G,再要大的话就难解决了,网上也贴过好多帖子,没几个想得出好办法..不知道楼主文件多大啊?
你后面删掉了读取的语句,当然可以显示出“打开成功”
你要在“打开成功”后加个DoEvents以前的代码也可以显示出来.
我一直是用二进制打开方式操作那些给人看的文本文件,一次性读入所有的内容,从5M的文件开始有点吃力了.
写点代码吧,你拿去试下,看对你有帮助不.
按你的意思,边读文件,边将文件内容显示出来
你需要画一RichTextBox,两个按钮
RichTextBox的名称为RichText1, ScrollBars=2
两个Command名称
Command1 Caption="Read File" 开始读文件
Command2 Caption="Stop" 停止读文件
读取文件为"C:\1.txt"
窗体代码:
Dim iStop As Integer
Private Sub Command1_Click()
iStop = 0
Dim Data1 As String
Dim Fn As Long
Dim lFileLong As Double
Dim lReadL As Double
Dim lReadLs As Double
Dim iSpeed As Integer
iSpeed = 10
lReadL = 1024
lReadL = lReadL * iSpeed
lReadLs = 0
RichText1.Text = ""
Fn = FreeFile
Open "c:\1.txt" For Binary As #Fn
lFileLong = LOF(Fn)
Do While lReadLs < lFileLong And iStop = 0
If lFileLong - lReadLs <= lReadL Then lReadL = lFileLong - lReadLs
Seek #Fn, lReadLs + 1
DoEvents
Data1 = Input$(lReadL, #Fn)
lReadLs = lReadLs + lReadL
RichText1.Text = RichText1.Text & Data1
DoEvents
Loop
Close #Fn
MsgBox "读入文件完毕!"
End Sub
Private Sub Command2_Click()
iStop = 1
End Sub
补充说明:
iSpeed值可以随你设,最小为1,最大65535,意思就是每次读入数据的多少,iSpeed=1的时候每次读入1024 Bytes数据,并将其显示在RichTextBox,iSpeed越小,读取间隔越短,但是读入效率低,你可以比较随意的拖动滚动条到你想浏览的地方;iSpeed越大,读取间隔越长,把文件完整读入所需的时间相对短,但是过大的话你就不容易拖动滚动条.
你可以在读取文件的同时浏览已经读入的文本数据.
我没测试最大能读多大的文件..也不知道你需要读多大的文件.
(理论上我猜测越读到后面越慢.因为RichTextBox.Text的属性操作越到后面需要的内存越大)
补充:
以下代码改下,应该可以满足要求.
Dim iStop As Integer
Private Sub Command1_Click()
Dim sfFileName As String '文件名
Dim sReadData As String
Dim Fn As Long
Dim lFileLong As Double
Dim lReadL As Double
Dim lReadLs As Double
Dim iSpeed As Integer
sfFileName = App.Path & "\ywtest.tfm"
iSpeed = 5
lReadL = 1024
lReadL = lReadL * iSpeed
lReadLs = 0
sReadData = ""
Fn = FreeFile
Open sfFileName For Binary As #Fn
lFileLong = LOF(Fn)
Do While lReadLs < lFileLong And iStop = 0
If lFileLong - lReadLs <= lReadL Then lReadL = lFileLong - lReadLs
Seek #Fn, lReadLs + 1
DoEvents
sReadData = sReadData & Input$(lReadL, #Fn) '将上次未完成处理的字符和本次读取的字符合并在一起
lReadLs = lReadLs + lReadL
Call ListAddItem(sReadData) '调用函数处理所得的字符串
DoEvents
Loop
Close #Fn
Call ListAddItem(sReadData, True) '处理未完成处理的最后剩余字符
MsgBox "读入文件完毕!"
End Sub
Private Sub Command2_Click()
iStop = 1
End Sub
'将读出的行添加到列表
'变量说明:
'sDealStr (传地址) 读取出来所处理的字符串
'isWithOutEnter 如果字符串结尾没有回车,是否将剩余字符判断为一行(用于文件最后一行有时没有回车换行的情况)
Private Sub ListAddItem(ByRef sDealStr As String, Optional isWithOutEnter As Boolean = False)
Dim ln As Double '查找回车换行字符储存的地址
Dim lnLast As Double '上一次的地址
Dim longDealStr As Double '字符串长度
Dim sFindStr As String '一行字符的保存变量
longDealStr = Len(sDealStr)
ln = 0
lnLast = -1
Do
ln = InStr(ln + 1, sDealStr, vbCrLf) '在sDealStr中查找回车换行符
If ln = 0 Then
If isWithOutEnter = False Then '不提取剩余字符,直接退出
Exit Do
Else '准备将剩余字符提取
ln = longDealStr + 1
End If
End If
sFindStr = Mid(sDealStr, lnLast + 2, ln - lnLast - 2) '提取一行字符
List1.AddItem sFindStr '添加到列表(此处你可以调用你的代码处理sFindStr,即你的linestr
lnLast = ln
DoEvents
Loop While ln < longDealStr '如果查找到地址小于总长度则继续查找下一个
If longDealStr - lnLast - 1 > 0 Then
If lnLast > 0 Then '如果最后一次的地址存在则将该地址之前的字符全部去掉
sDealStr = Right(sDealStr, longDealStr - lnLast)
'此时sDealStr只剩余没处理完的字符
End If
Else '如果地址结束则直接清空
sDealStr = ""
End If
End Sub
在Form里画一个ListBox和两个Command
你后面删掉了读取的语句,当然可以显示出“打开成功”
你要在“打开成功”后加个DoEvents以前的代码也可以显示出来.
我一直是用二进制打开方式操作那些给人看的文本文件,一次性读入所有的内容,从5M的文件开始有点吃力了.
写点代码吧,你拿去试下,看对你有帮助不.
按你的意思,边读文件,边将文件内容显示出来
你需要画一RichTextBox,两个按钮
RichTextBox的名称为RichText1, ScrollBars=2
两个Command名称
Command1 Caption="Read File" 开始读文件
Command2 Caption="Stop" 停止读文件
读取文件为"C:\1.txt"
窗体代码:
Dim iStop As Integer
Private Sub Command1_Click()
iStop = 0
Dim Data1 As String
Dim Fn As Long
Dim lFileLong As Double
Dim lReadL As Double
Dim lReadLs As Double
Dim iSpeed As Integer
iSpeed = 10
lReadL = 1024
lReadL = lReadL * iSpeed
lReadLs = 0
RichText1.Text = ""
Fn = FreeFile
Open "c:\1.txt" For Binary As #Fn
lFileLong = LOF(Fn)
Do While lReadLs < lFileLong And iStop = 0
If lFileLong - lReadLs <= lReadL Then lReadL = lFileLong - lReadLs
Seek #Fn, lReadLs + 1
DoEvents
Data1 = Input$(lReadL, #Fn)
lReadLs = lReadLs + lReadL
RichText1.Text = RichText1.Text & Data1
DoEvents
Loop
Close #Fn
MsgBox "读入文件完毕!"
End Sub
Private Sub Command2_Click()
iStop = 1
End Sub
补充说明:
iSpeed值可以随你设,最小为1,最大65535,意思就是每次读入数据的多少,iSpeed=1的时候每次读入1024 Bytes数据,并将其显示在RichTextBox,iSpeed越小,读取间隔越短,但是读入效率低,你可以比较随意的拖动滚动条到你想浏览的地方;iSpeed越大,读取间隔越长,把文件完整读入所需的时间相对短,但是过大的话你就不容易拖动滚动条.
你可以在读取文件的同时浏览已经读入的文本数据.
我没测试最大能读多大的文件..也不知道你需要读多大的文件.
(理论上我猜测越读到后面越慢.因为RichTextBox.Text的属性操作越到后面需要的内存越大)
补充:
以下代码改下,应该可以满足要求.
Dim iStop As Integer
Private Sub Command1_Click()
Dim sfFileName As String '文件名
Dim sReadData As String
Dim Fn As Long
Dim lFileLong As Double
Dim lReadL As Double
Dim lReadLs As Double
Dim iSpeed As Integer
sfFileName = App.Path & "\ywtest.tfm"
iSpeed = 5
lReadL = 1024
lReadL = lReadL * iSpeed
lReadLs = 0
sReadData = ""
Fn = FreeFile
Open sfFileName For Binary As #Fn
lFileLong = LOF(Fn)
Do While lReadLs < lFileLong And iStop = 0
If lFileLong - lReadLs <= lReadL Then lReadL = lFileLong - lReadLs
Seek #Fn, lReadLs + 1
DoEvents
sReadData = sReadData & Input$(lReadL, #Fn) '将上次未完成处理的字符和本次读取的字符合并在一起
lReadLs = lReadLs + lReadL
Call ListAddItem(sReadData) '调用函数处理所得的字符串
DoEvents
Loop
Close #Fn
Call ListAddItem(sReadData, True) '处理未完成处理的最后剩余字符
MsgBox "读入文件完毕!"
End Sub
Private Sub Command2_Click()
iStop = 1
End Sub
'将读出的行添加到列表
'变量说明:
'sDealStr (传地址) 读取出来所处理的字符串
'isWithOutEnter 如果字符串结尾没有回车,是否将剩余字符判断为一行(用于文件最后一行有时没有回车换行的情况)
Private Sub ListAddItem(ByRef sDealStr As String, Optional isWithOutEnter As Boolean = False)
Dim ln As Double '查找回车换行字符储存的地址
Dim lnLast As Double '上一次的地址
Dim longDealStr As Double '字符串长度
Dim sFindStr As String '一行字符的保存变量
longDealStr = Len(sDealStr)
ln = 0
lnLast = -1
Do
ln = InStr(ln + 1, sDealStr, vbCrLf) '在sDealStr中查找回车换行符
If ln = 0 Then
If isWithOutEnter = False Then '不提取剩余字符,直接退出
Exit Do
Else '准备将剩余字符提取
ln = longDealStr + 1
End If
End If
sFindStr = Mid(sDealStr, lnLast + 2, ln - lnLast - 2) '提取一行字符
List1.AddItem sFindStr '添加到列表(此处你可以调用你的代码处理sFindStr,即你的linestr
lnLast = ln
DoEvents
Loop While ln < longDealStr '如果查找到地址小于总长度则继续查找下一个
If longDealStr - lnLast - 1 > 0 Then
If lnLast > 0 Then '如果最后一次的地址存在则将该地址之前的字符全部去掉
sDealStr = Right(sDealStr, longDealStr - lnLast)
'此时sDealStr只剩余没处理完的字符
End If
Else '如果地址结束则直接清空
sDealStr = ""
End If
End Sub
在Form里画一个ListBox和两个Command
展开全部
Private Sub Command1_Click()
Dim i As Integer
i = 0
Dim linestr As String
Print "开始读取文件。。。"
Open FilePath1 For Input As #1
Print "打开成功...."
Do While i < 2
DoEvents '加这一句不会死机
Line Input #1, linestr
i = i + 1
Me.Caption = CStr(i) '加这一句
Loop
Print "ok"
End Sub
------------------
再不行,就将文件导到数据库里处理吧,最好是sql server里。
Dim i As Integer
i = 0
Dim linestr As String
Print "开始读取文件。。。"
Open FilePath1 For Input As #1
Print "打开成功...."
Do While i < 2
DoEvents '加这一句不会死机
Line Input #1, linestr
i = i + 1
Me.Caption = CStr(i) '加这一句
Loop
Print "ok"
End Sub
------------------
再不行,就将文件导到数据库里处理吧,最好是sql server里。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
linestr 变量是字符串变量,最大是65535个字节,如果你的文件大于65Kb,那么这个变量就无能为力了。
如果导入数据库对Access数据库就OEL数据格式也只能存储1G的二进制数据,对于SQL数据库,也只能存储2G左右的数据,因此建议你将文件分割,最大不能超过1G然后分别导入Access数据库查询即可。
如果导入数据库对Access数据库就OEL数据格式也只能存储1G的二进制数据,对于SQL数据库,也只能存储2G左右的数据,因此建议你将文件分割,最大不能超过1G然后分别导入Access数据库查询即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以用以下的代码来编写读代码:
open "文件名" for input as #1
do while not eof(1)
line input #1,aspect$
whole$=whole$+aspect$+chr$(13)+chr$(10)
loop
text1.text=whole$
close #1
open "文件名" for output as #1
print #1 ,text1.text
close #1
可以用以下的代码来编写写代码:
open "文件名" for output as #1
a$=inputbox("请输入信息")
do while a$<>-1
write #1,a$
a$=inputbox("请输入信息")
loop
close #1
open "文件名" for input as #1
do while not eof(1)
line input #1,aspect$
whole$=whole$+aspect$+chr$(13)+chr$(10)
loop
text1.text=whole$
close #1
open "文件名" for output as #1
print #1 ,text1.text
close #1
可以用以下的代码来编写写代码:
open "文件名" for output as #1
a$=inputbox("请输入信息")
do while a$<>-1
write #1,a$
a$=inputbox("请输入信息")
loop
close #1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
根据我的经验,以前我也做过这事.2M的没问题,再大,一直大到60M吧就不行了,好象是12M.我感觉是VB的限制,听说变量能存储2G的东西超过2G就不行了,也可能是WINDOWS的限制.
你按照楼上的试试,一行一行的读然后在连接到一个变量里看看.
希望对你有帮助
你按照楼上的试试,一行一行的读然后在连接到一个变量里看看.
希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询