Toon posts:

[VB6] Offset instellen bij lezen (sequentieel) tekstbestand

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is het mogelijk om een offset te specificeren bij het lezen van een tekstbestand? Dus dat je bijvoorbeeld aan kan geven dat het inlezen moet gebeuren vanaf regel 15. Ik wil namelijk steeds blokken met tekst uit een bestand lezen en vervolgens wegschrijven in losse bestanden. Het uit te lezen bestand is zo'n 2 gig, dus het is geen optie om in een keer alles in een var te laden, aangezien ik dan aanneem dat het programma zeker vastloopt.

Mocht het bovengenoemde niet mogelijk zijn, dan heb ik al bedacht dat ik linebreaks kan gaan tellen en vervolgens beginnen met opslaan van data wanneer er op een bepaald aantal linebreaks gematched wordt. Echter vind ik dit nogal omslachtig als het niet nodig is. Tevens is het geen optie om met directebestandstoegang te werken aangezien het aangeleverde bestand een tekstbestand is.

[ Voor 21% gewijzigd door Verwijderd op 24-11-2004 13:31 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-05 07:31

Janoz

Moderator Devschuur®

!litemod

Uiteindelijk moet voor het bepalen van het aantal al ingelezen regels, toch echt het aantal linebreaks getelt worden.

Waarom kun je het bestand niet gewoon regel voor regel inlezen en bepalen wat je met die rgel gaat doen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-05 17:10

LauPro

Prof Mierenneuke®

Je kan met fseek afaik een positie bepalen. Het beste is dan om het bestand binair te openen volgens mij. Maar dannog moet je beginnen de linebreaks te tellen...

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Verwijderd

Topicstarter
Uiteindelijk moet voor het bepalen van het aantal al ingelezen regels, toch echt het aantal linebreaks getelt worden.

Waarom kun je het bestand niet gewoon regel voor regel inlezen en bepalen wat je met die rgel gaat doen?
Ja dat kan natuurlijk ook. Daar had ik nog niet aan gedacht. Dan plaats ik de instructies om de codeblokken weg te schrijven in de leeslus. Wordt trouwens het geheugen vrijgegeven als je een variabele leeggooit (bv. MyVar = "")? Dat is namelijk wel essentieel bij het inlezen van dergelijk grote bestanden.

Bedankt in ieder geval voor het antwoord.

[ Voor 28% gewijzigd door Verwijderd op 24-11-2004 13:48 ]


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

LauPro schreef op woensdag 24 november 2004 @ 13:44:
Je kan met fseek afaik een positie bepalen. Het beste is dan om het bestand binair te openen volgens mij. Maar dannog moet je beginnen de linebreaks te tellen...
Geloof niet dat VB6 het commando fseek kent...

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 21-12-2025
Geloof niet dat VB6 het commando fseek kent...
Seek Statement


Sets the position for the next read/write operation within a file opened using the Open statement.

Syntax

Seek [#]filenumber, position

The Seek statement syntax has these parts:

Part Description
filenumber Required. Any validfile number.
position Required. Number in the range 1 – 2,147,483,647, inclusive, that indicates where the next read/write operation should occur.

Bron: "Boek: VB & VBA in a Nutshell"
Zie voor meer info: http://msdn.microsoft.com.../vblr7/html/vafctseek.asp
En nog meer info over random access of een bestand: http://msdn.microsoft.com...usingrandomfileaccess.asp

[ Voor 30% gewijzigd door djexplo op 24-11-2004 14:18 . Reden: Info ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Verwijderd

Verwijderd schreef op woensdag 24 november 2004 @ 13:47:
[...]


Ja dat kan natuurlijk ook. Daar had ik nog niet aan gedacht. Dan plaats ik de instructies om de codeblokken weg te schrijven in de leeslus. Wordt trouwens het geheugen vrijgegeven als je een variabele leeggooit (bv. MyVar = "")? Dat is namelijk wel essentieel bij het inlezen van dergelijk grote bestanden.

Bedankt in ieder geval voor het antwoord.
ALs je gewoon Line Input gebruikt leest VB regel voor regel. Dan heb je toch helemaal niets te maken met de grootte van het bestand?

Verwijderd

zo'n groot bestand kan je opsplitsen met de textstream methode uit de scripting bibliotheek.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

djexplo schreef op woensdag 24 november 2004 @ 14:13:
[...]

Seek Statement


Sets the position for the next read/write operation within a file opened using the Open statement.

[...]
Damn... had nog wel gezocht in de MSDN Library die ik geinstalleerd had staan. beetje met mijn neus gezocht dus. Dankjewel voor de correctie!

Verwijderd

Verwijderd schreef op woensdag 24 november 2004 @ 14:20:
[...]

ALs je gewoon Line Input gebruikt leest VB regel voor regel. Dan heb je toch helemaal niets te maken met de grootte van het bestand?
Mijn opmerking had dan ook betrekking op de variabele waarin ik de uitgelezen regels tekst opsloeg. Om een e.v.t. overflow te voorkomen gooi ik hem steeds leeg nadat ik de blokken tekst heb weggeschreven.

[ Voor 3% gewijzigd door Verwijderd op 24-11-2004 22:38 ]


Verwijderd

djexplo schreef op woensdag 24 november 2004 @ 14:13:
[...]

Seek Statement


Sets the position for the next read/write operation within a file opened using the Open statement.

Syntax

Seek [#]filenumber, position

The Seek statement syntax has these parts:

Part Description
filenumber Required. Any validfile number.
position Required. Number in the range 1 – 2,147,483,647, inclusive, that indicates where the next read/write operation should occur.

Bron: "Boek: VB & VBA in a Nutshell"
Zie voor meer info: http://msdn.microsoft.com.../vblr7/html/vafctseek.asp
En nog meer info over random access of een bestand: http://msdn.microsoft.com...usingrandomfileaccess.asp
Dankjewel! Mijn programma werkt nu en zal ongeveer 30 uur bezig zijn met het verwerken van het bronbestand. Dat krijg je ervan als je VB 6 misbruikt voor zaken waar het niet voor bedoeld is. >:)

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Verwijderd schreef op woensdag 24 november 2004 @ 22:40:
[...]


Dankjewel! Mijn programma werkt nu en zal ongeveer 30 uur bezig zijn met het verwerken van het bronbestand. Dat krijg je ervan als je VB 6 misbruikt voor zaken waar het niet voor bedoeld is. >:)
Waarschijnlijk heb je 'minder goed geoptimaliseerd'.

1) declareer je je variabelen wel van het juiste type? Dus String bij strings en Long bij (hele) getallen?
2) Hoe vaak moet jij een opgegeven regelnummer zoeken in je bestand? Is dit vaker dan, zeg, 5 keer, dan kun je - als dat tekstbestand in de tussentijd niet wijzigt natuurlijk - eenmalig een hulparray (of zelfs -bestand) maken waarin je opslaat waar het begin van regelnummer X te vinden is.

Maak daarvoor een array:

Dim offsets() As Long

open je bestand eenmalig en bepaal hoeveel regels het bestand is

doe dan

Redim offsets(1 to aantalregels) as long

open je bestand nog eens en vul je de array met waar je het begin van elke regel kunt vinden. (ja, die twee vorige stappen kunnen ook in 1 keer... dat is voor de volgende les ;) ).

Vanaf dat moment kun je met Open bla For Binary en het commando Seek zeer snel de gewenste regel terugvinden, in plaats van dat je elke keer gemiddeld 1 GB aan data moet inlezen...

  • abeker
  • Registratie: Mei 2002
  • Laatst online: 12-05 15:06

abeker

...

3) Je compileert hopelijk wel naar Native code met optimizations en advanced optimizations ingeschakeld
4) Als je veel data moet lezen, kun je beter de windows api gebruiken in plaats van de vb functies

the less one forgets, the less one remembers


Verwijderd

abeker schreef op donderdag 25 november 2004 @ 09:55:
3) Je compileert hopelijk wel naar Native code met optimizations en advanced optimizations ingeschakeld
4) Als je veel data moet lezen, kun je beter de windows api gebruiken in plaats van de vb functies
Dan heeft hij wel de Professional of de Enterprise editie nodig.

Verwijderd

djexplo schreef op woensdag 24 november 2004 @ 14:13:
[...]


Syntax

Seek [#]filenumber, position

The Seek statement syntax has these parts:

Part Description
filenumber Required. Any validfile number.
position Required. Number in the range 1 – 2,147,483,647, inclusive, that indicates where the next read/write operation should occur.

Bron: "Boek: VB & VBA in a Nutshell"
Zie voor meer info: http://msdn.microsoft.com.../vblr7/html/vafctseek.asp
En nog meer info over random access of een bestand: http://msdn.microsoft.com...usingrandomfileaccess.asp
Waarschijnlijk wordt het nog krap ook, want je bestand was twee gig. Zoals het hier te zien is lijkt het dat seek tot de 2 gig kan gaan.
Pagina: 1