[VB6] carriage return & line feed wissen in een txt bestand

Pagina: 1
Acties:
  • 174 views sinds 30-01-2008
  • Reageer

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Hallo,

heb het volgende probleempje. In een txt file staan een aantal nummers onder elkaar gerangschikt. Deze nummers zou ik langs elkaar willen krijgen, gescheiden door een komma.

Ik dacht eerst aan het txt bestand uit te lezen, de positie lezen waar de 'vbCrLf' zit, en dan het teken op deze positie vervangen door ","

Achteraf schrijf ik die string weg naar een nieuwe txt.

voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
dim regel as string
dim nieuweregel as string
dim positie as integer

open "c:\test\input.txt" for input as #1
while not EOF(1)
   input #1, regel
   positie = instr(regel,vbcrlf)
   enzovoort....
wend

het probleem hier: in positie komt altijd de waarde 0 te staan

Een ander probleem wat zich later vormt...als ik terug een string wegschrijf naar een txt met write of print, dan komt de carriage return line feed er weer automatisch bij...

Heeft iemand een idee hoe ik dit zou moeten aanpakken?
De oorspronkelijke gegevens komen uit een excell werkblad dat ik opsla als txt. Als ik de gegevens rechtstreeks langs elkaar kan zetten in excell, dan is het ook goed (nog beter misschien).

Groeten

[ Voor 3% gewijzigd door mmy841 op 08-03-2005 21:31 ]


Verwijderd

Met input #1 lees je de regel tot de newline; daar zit vbCrLf dus niet in. Je zult dus als een bytestream moeten gaan lezen.

gebruik voortaan [code]-tags aub

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Programmeerproblemen mogen in /PW :)

SA > PW

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Verwijderd schreef op dinsdag 08 maart 2005 @ 21:29:
Met input #1 lees je de regel tot de newline; daar zit vbCrLf dus niet in. Je zult dus als een bytestream moeten gaan lezen.

gebruik voortaan [code]-tags aub
kan je ook een klein voorbeeldje geven hoe ik dat zo inlees? Want ik lijk niet zo direct iets erover te vinden.

ik probeerde het zo, maar kreeg error
code:
1
2
3
4
5
6
7
8
9
10
11
Dim regel As String
    
    Open "c:\test\input.txt" For Binary As #1
    Open "c:\test\output.txt" For Binary As #2
    
    While Not EOF(1)
        Get #1, , regel
        Put #2, , regel
    Wend
        
    Close

[ Voor 44% gewijzigd door mmy841 op 08-03-2005 21:58 . Reden: code voorbeeldje erbij ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:42

Robtimus

me Robtimus no like you

Verwijderd schreef op dinsdag 08 maart 2005 @ 21:29:
Met input #1 lees je de regel tot de newline; daar zit vbCrLf dus niet in. Je zult dus als een bytestream moeten gaan lezen.
Tuurlijk niet. Hij wil juist de regel zonder vbCrLf, die krijgt hij gewoon met input #1. Gewoon achter elkaar plakken geblazen.
code:
1
2
3
4
5
6
7
8
9
10
11
dim alles, regel as string

alles = ""
open "c:\test\input.txt" for input as #1
while not EOF(1)
    input #1, regel
    if alles <> "" then
        alles = alles & ", "
    end if
    alles = alles & regel
wend
Die ene check is om ervoor te zorgen dat je alleen komma's tussen de "regels" krijgt.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Dank u Iceman!!!!!!!!!!!!!!

Verwijderd

IceManX schreef op dinsdag 08 maart 2005 @ 22:40:
[...]
Tuurlijk niet. Hij wil juist de regel zonder vbCrLf, die krijgt hij gewoon met input #1. Gewoon achter elkaar plakken geblazen.
|:(
Ik had voorbij gekeken aan het oorspronkelijke probleem...

Verwijderd

niet echt gerelateerd aan het probleem, maar ik raad je ook aan om niet harde filenummer te gebruiken, maar code zoals dit
Visual Basic .NET:
1
2
DIM InFile as long
InFile = Freefile

Op die manier kun je je code iets degelijker en leesbaarder maken

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 09 maart 2005 @ 02:26:
niet echt gerelateerd aan het probleem, maar ik raad je ook aan om niet harde filenummer te gebruiken, maar code zoals dit
Visual Basic .NET:
1
2
DIM InFile as long
InFile = Freefile

Op die manier kun je je code iets degelijker en leesbaarder maken
En om het dan compleet te maken (mits je textfile niet enorm groot is!):
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Dim FF As Integer
    Dim sTMP As String
    
    'Bestand in 1 klap inlezen
    FF = FreeFile                   'Vrije file handle
    Open "C:\blabla\myfile.txt" For Binary As #FF
    sTMP = String(LOF(FF), Chr(0))  'Init string op lengte bestand
    Get #FF, , sTMP                 'Lees bestand in string
    Close #FF                       'Klaar met lezen, handle vrijgeven
    
    'In 1 klap alle cr/lf vervangen door komma's
    sTMP = Replace(sTMP, vbCrLf, ",")
    
    'In 1 klap bestand wegschrijven
    FF = FreeFile
    Open "C:\blabla\myoutfile.txt" For Binary As #FF
    Put #FF, , sTMP                 'Schrijven van de gecorrigeerde string
    Close #FF

Scheelt allerlei while...wend, do...loop etc. lussen en het herhaaldelijk concatten van strings aan elkaar. Als het goed is is dit stukken sneller (als het uberhaupt al een meetbare tijd duurt dan)... Wellicht dus wat meer code, maar scheelt in executietijd. Helaas is dit wel weer wat geheugen-onvriendelijker, maar als je bestand dus niet enorm is is er niks aan de hand en kan Windows zelfs waarschijnlijk beter gebruik maken van je disk-cache en andere optimalisaties om het nog meer te versnellen.
IceManX schreef op dinsdag 08 maart 2005 @ 22:40:
code:
1
    if alles <> "" then
Die ene check is om ervoor te zorgen dat je alleen komma's tussen de "regels" krijgt.
Eigenlijk wel offtopic, maar misschien ook wel interessant: In "VB6 kringen" wordt doorgaans geadviseerd om, als je wil checken op een lege string, de Len() functie te gebruiken. Dit kan meestal makkelijk 50% winst (ophalen op die ene instructie dan):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Const cLoops = 100000000
    Dim tStart As Single
    Dim T As Long
    Dim S As String
    
    tStart = Timer
    For T = 1 To cLoops
        If S <> "" Then Debug.Print "Dit zie je nooit"
    Next
    Debug.Print "Methode 1: " & Timer - tStart

    tStart = Timer
    For T = 1 To cLoops
        If Len(S) <> 0 Then Debug.Print "Dit zie je nooit"
    Next
    Debug.Print "Methode 2: " & Timer - tStart

    tStart = Timer
    For T = 1 To cLoops
        If StrComp(S, "") <> 0 Then Debug.Print "Dit zie je nooit"
    Next
    Debug.Print "Methode 3: " & Timer - tStart

Gooi dit maar eens in je VB en give it a go :+

Methode 1 is jouw methode. Methode 2 is de "aanbevolen" methode en Methode 3 is een 3e alternatief dat doorgaans ook sneller is dan methode 1, maar het altijd verliest van methode 2.

Mijn output:
code:
1
2
3
Methode 1: 6,543945
Methode 2: 3,078125
Methode 3: 5,637695

Niet dat het dus heel erg veel zin heeft om te optimaliseren als dit statement maar 4x ofzo wordt uitgevoerd, maar in grote complexe lussen kunnen dit soort optimalisaties soms leuke snelheidswinsten opleveren. Ik heb er zelden een toepassing voor, granted, maar heb er gewoon een goede gewoonte van gemaakt om dit te doen. Misschien dat je iets hebt aan deze informatie :Y) en misschien ook niet :P

edit:
En ja, het Timer object is nou niet echt je van het, dus let niet op de 6 decimalen achter de komma. Je ziet natuurlijk dat dit gewoon 50% scheelt (ruim 3 seconden dus).

[ Voor 95% gewijzigd door RobIII op 09-03-2005 03:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Daos
  • Registratie: Oktober 2004
  • Niet online
mmy schreef op dinsdag 08 maart 2005 @ 21:21:
code:
1
2
3
4
5
6
7
8
9
10
dim regel as string
dim nieuweregel as string
dim positie as integer

open "c:\test\input.txt" for input as #1
while not EOF(1)
   input #1, regel
   positie = instr(regel,vbcrlf)
   enzovoort....
wend
Bestaat de "line input #1, regel" niet meer?
Een ander probleem wat zich later vormt...als ik terug een string wegschrijf naar een txt met write of print, dan komt de carriage return line feed er weer automatisch bij...

Heeft iemand een idee hoe ik dit zou moeten aanpakken?
Print afsluiten met een ;
De oorspronkelijke gegevens komen uit een excell werkblad dat ik opsla als txt. Als ik de gegevens
rechtstreeks langs elkaar kan zetten in excell, dan is het ook goed (nog beter misschien).
Dat kan in VBA. Voor de veiligheid is het het beste dat code en data gescheiden zijn. Met VBA prop je code in je document. Dat kan je dus beter niet doen.
Hallo,
...
Groeten
Dat doen we altijd al automatisch. Dat hoef je dus niet meer te vermelden.
Pagina: 1