Article View: nl.comp.programmeren
Article #204Re: Een grote tekstfile weergeven.
From: Dr.Ruud
Date: Fri, 28 Jan 2005 18:36
Date: Fri, 28 Jan 2005 18:36
117 lines
4639 bytes
4639 bytes
Toen ik Bastiaan kietelde, kwam er dit uit:
> Je hebt een file met louter ASCII tekens boven de 31, van 16.000.010
> bytes groot. Open hem met LIST en druk op End. Nu laat-ie 22 hele
> regels zien, en 1 regel van 10.
Ik neem dus aan dat je dan (maximaal) 23 dataregels van 80 tekens op je
scherm hebt. (Je kunt LIST ook anders instellen.)
En waarschijnlijk zijn regel 1 en 25 bezet met meta- en hulp-informatie.
> Stel nu dat het 1e teken in die file een tab
> is, en je doet hetzelfde. Dan laat list weer 22 hele regels zien, maar
> nu 1 regel van 17. Hiervoor moet hij dan wel weten dat er een tab is,
> en ook op welke positie die staat in de modulus van 8. Dus moet hij
> wel de hele file lezen
Ben ik (eindelijk) met je eens. Dit hoeft overigens ook puur in VB niet
lang te duren, gebruik bijvoorbeeld zoiets:
Function do_File(fName As String)
Const C_LINESIZE = 80
Const C_TABSIZE = 8
Const C_BUFFERSIZE = 131072 ' if < 32768, append an & (like 16384&)
Dim fInput As Integer
Dim fLen As Long
Dim fBuffer(1 To C_BUFFERSIZE) As Byte
Dim fRec As Long
Dim fRecs As Long
Dim fOffset As Long
Dim timer0 As Double
Dim i As Long
Dim iMax As Long
Dim iPos As Integer
Debug.Print "----------------------"
timer0 = Timer
Debug.Print "Start:", Time()
fInput = FreeFile(0)
Open fName For Binary Access Read As fInput
fLen = LOF(fInput)
Debug.Print "Size of file:", fLen
fRecs = (fLen + C_BUFFERSIZE - 1) \ C_BUFFERSIZE
Debug.Print "Nr. of records:", fRecs
Debug.Print "Nr. of full records:", (fLen \ C_BUFFERSIZE), _
"( * "; C_BUFFERSIZE; " = "; _
(fLen \ C_BUFFERSIZE) * C_BUFFERSIZE; ")"
fOffset = 1
iPos = 1
For fRec = 1 To fRecs
Get #1, fOffset, fBuffer
iMax = fLen - fOffset + 1
If iMax > C_BUFFERSIZE Then
iMax = C_BUFFERSIZE
End If
For i = 1 To iMax
Select Case fBuffer(i)
Case 9 ' HT
iPos = iPos + 8 - (iPos Mod C_TABSIZE)
Case 10 ' LF
'no horizontal move
Case 11 ' VT
'no horizontal move
Case 12 ' FF
iPos = 1
Case 13 ' CR
iPos = 1
Case Else
iPos = iPos + 1
End Select
If iPos > C_LINESIZE Then
iPos = 1
End If
Next i
#If 0 Then
Debug.Print iPos,
If 0 = (fRec Mod 8) Then Debug.Print
#End If
fOffset = fOffset + iMax
Next fRec
Debug.Print
Debug.Print "Last position:", iPos
Debug.Print "End:", Time(), "= "; Round(Timer - timer0, 2); " seconds"
Debug.Print
Close fInput
End Function
Die doet er in mijn VBA minder dan een seconde per MB over, dus dat zal
in (gecompileerde) VB wel wat sneller gaan.
--
Affijn, Ruud ` - ?
+ ` ? *
? ` Jvr qvg yrrfg,
? = ` fgresg wbatre.
Technical Details
Message-ID:
<cte4c1.4c8.1@news.isolution.nl>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!syros.belnet.be!news.belnet.be!transit.news.xs4all.nl!post.news.xs4all.nl!not-for-mailReferences:
<41e7d020$0$4377$58c7af7e@news.kabelfoon.nl> <GnZFd.31178$I24.2672738@phobos.telenet-ops.be> <41f50ed3$0$281$4d4ebb8e@news.nl.uu.net> <10va6t6ejodst63@corp.supernews.com> <ct3j0f.1d0.1@news.isolution.nl> <10valcrcncfhm8a@corp.supernews.com> <41f57c8b$0$14124$4d4ebb8e@news.nl.uu.net> <ct53al.1b8.1@news.isolution.nl> <41f68928$0$14113$4d4ebb8e@news.nl.uu.net> <10vd3kfqrk9jv43@corp.supernews.com> <41f6a14a$0$283$4d4ebb8e@news.nl.uu.net> <ct6tmg.4k.1@news.isolution.nl> <41f7d857$0$274$4d4ebb8e@news.nl.uu.net> <ct8ugk.4n8.1@news.isolution.nl> <41f93415$0$14124$4d4ebb8e@news.nl.uu.net> <ctbitc.4kg.1@news.isolution.nl> <41f968a7$0$282$4d4ebb8e@news.nl.uu.net> <ctddbt.4p0.1@news.isolution.nl> <41fa4955$0$14124$4d4ebb8e@news.nl.uu.net>Show Full Headers
Complete Article Headers
X-Google-Thread: 107324,cc6ea8d92fe92f6d
X-Google-Thread: fcea4,cc6ea8d92fe92f6d
X-Google-Attributes: gid107324,gidfcea4,public
X-Google-Language: DUTCH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!syros.belnet.be!news.belnet.be!transit.news.xs4all.nl!post.news.xs4all.nl!not-for-mail
Message-ID: <cte4c1.4c8.1@news.isolution.nl>
From: "Dr.Ruud" <rvtol+news@isolution.nl>
Newsgroups: nl.comp.programmeren,be.comp.programming
References: <41e7d020$0$4377$58c7af7e@news.kabelfoon.nl> <GnZFd.31178$I24.2672738@phobos.telenet-ops.be> <41f50ed3$0$281$4d4ebb8e@news.nl.uu.net> <10va6t6ejodst63@corp.supernews.com> <ct3j0f.1d0.1@news.isolution.nl> <10valcrcncfhm8a@corp.supernews.com> <41f57c8b$0$14124$4d4ebb8e@news.nl.uu.net> <ct53al.1b8.1@news.isolution.nl> <41f68928$0$14113$4d4ebb8e@news.nl.uu.net> <10vd3kfqrk9jv43@corp.supernews.com> <41f6a14a$0$283$4d4ebb8e@news.nl.uu.net> <ct6tmg.4k.1@news.isolution.nl> <41f7d857$0$274$4d4ebb8e@news.nl.uu.net> <ct8ugk.4n8.1@news.isolution.nl> <41f93415$0$14124$4d4ebb8e@news.nl.uu.net> <ctbitc.4kg.1@news.isolution.nl> <41f968a7$0$282$4d4ebb8e@news.nl.uu.net> <ctddbt.4p0.1@news.isolution.nl> <41fa4955$0$14124$4d4ebb8e@news.nl.uu.net>
Subject: Re: Een grote tekstfile weergeven.
Date: Fri, 28 Jan 2005 19:36:42 +0100
Organization: Chaos rules.
X-Newsreader: WMDIYB
X-Archive-Me: please
Approved: yesterday
X-Face: &CQ$FIr!=+=w,8`0Q^Ug"1>F[(/op8->E;NQet`5fe$;=e*!Z5&REvp<~Tj|"Y[|8OcJ{w#z&mB7B:I)XO*%_|\]|YW$C>>$Q[9-#K~c$tQ^Mf0,wMo?h\C)TE>f
Lines: 119
NNTP-Posting-Host: 194.109.164.102
X-Trace: 1106937604 news.xs4all.nl 28989 [::ffff:194.109.164.102]:33255
X-Complaints-To: abuse@xs4all.nl