🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: nl.comp.programmeren
Article #204

Re: Een grote tekstfile weergeven.

#204
From: Dr.Ruud
Date: Fri, 28 Jan 2005 18:36
117 lines
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-mail
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>

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