永发信息网

VB如何读取大的文本文件

答案:7  悬赏:0  手机版
解决时间 2021-02-10 19:54
VB如何读取大的文本文件
最佳答案
可以用以下的代码来编写读代码:
  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
全部回答
用文件系统对象读取,FileSystemObject. 下面的例子是是我把一个文件里的所有字符读入到一个String变量里,希望对你有启发:
Dim fso As New FileSystemObject, fil As File, ts As TextStream
Dim strSend As String
strSend = ""
Set fil = fso.GetFile(App.Path & "\file\JCI._EXH.TXT")
Set ts = fil.OpenAsTextStream(ForReading, -2)
strSend = ts.ReadAll
Set fil = Nothing
Set ts = Nothing
此时变量 strSend里储存了JCI._EXH.TXT文本里所有的内容.并且速度很快.
不知道你的文件多大,我是用一部小说测试的,3M多一点,读到一个string变量里只是一眨眼的工夫,绝对不到一秒钟
Private Sub Form_Load()
Dim allstr$
Debug.Print "开读"
ReadFrom "e:\生肖守护神.txt", allstr
Debug.Print "读完"
End Sub
Sub ReadFrom(FileName$, TXT$)
Dim fn&: fn = FreeFile
Open FileName For Input As #fn
TXT = StrConv(InputB$(LOF(fn), fn), vbUnicode)
Close #fn
End Sub
根据我的经验,以前我也做过这事.2M的没问题,再大,一直大到60M吧就不行了,好象是12M.我感觉是VB的限制,听说变量能存储2G的东西超过2G就不行了,也可能是WINDOWS的限制.
你按照楼上的试试,一行一行的读然后在连接到一个变量里看看.
希望对你有帮助
linestr 变量是字符串变量,最大是65535个字节,如果你的文件大于65Kb,那么这个变量就无能为力了。
如果导入数据库对Access数据库就OEL数据格式也只能存储1G的二进制数据,对于SQL数据库,也只能存储2G左右的数据,因此建议你将文件分割,最大不能超过1G然后分别导入Access数据库查询即可。
不懂了,
Do While i < 2
Line Input #1, linestr
i = i + 1
Loop
应该只是读了两行数据的啊,怎么会挂了呢?
记得好象一般上限是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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
男朋友最近一直爱出汗 湿漉漉的 明明很凉快的
12款还是14款新宝来好啊?
暗黑2人物死亡后的经验值
我被人跟踪恐吓,怎么办?我知道是谁派来的
在Unity中,利用Trigger和OnGUI实现信息提示
我要租150平米以上200平米以下的房子
房地产市场营销活动调查主要包括房地产产品、
realflow效果是不是只有mentray渲染器才能渲
最近一段晚上总是失眠 到半夜两三点才有睡意
在操作时提示user connection pool is null
打开中国象棋进入时提示更新系统注册记录失败
【一刀切】一刀切在哲学上犯了什么错
下列关于转基因植物的叙述。正确的是A. 转入
海尔bcd-216sdegu1冷冻温度零下28度,设定的
鹰山社区北门在什么地方啊,我要过去处理事情
推荐资讯
班樟湖社区家庭暴力投诉站地址有知道的么?有
盛祥家装汉唐壁画加工厂地址有知道的么?有点
读《中国家风》《无字家训》后感
宝信汽贸(嘉定镇圣塔路2号圣塔大桥红绿灯)地
临沂佳鑫物流公司怎么去啊,我要去那办事
已知一次函数y=kx+4与x轴交于a点,与y轴交于b
动物园里有三只熊,公熊每顿要吃15公斤肉,母
我古人拥有残
发尾指头发的()。
轻工研究所小区在哪里啊,我有事要去这个地方
眼镜蛇电子狗5700与5800那款好用
【尽开颜是什么意思】《七律·长征》中尽开颜
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?