[VB] tekenreeks vervangen in een .cfg bestand.

Pagina: 1
Acties:

  • ÜberWicked
  • Registratie: Oktober 2004
  • Laatst online: 09-05 18:21
Hallo,

een database applicatie (interbase) maakt gebruik van een .cfg file.
Hierin staat het pas naar de server en database file.

Een willekeurig .cfg file ziet er zo uit:

Afbeeldingslocatie: http://nicolaasboys.nl/test/got/vim.gif

De regel 'c:\win\OldBase\Vips2000.gdb' wil ik nu graag met VisualBasic vervangen.

Hoe kan ik dit het beste doen?

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Het bestand openen, de tekst inlezen en de te vervangen tekst vervangen door de nieuwe, gewenste tekst.

Ik mis een beetje wat je doel is en wat je zelf al geprobeerd hebt om dat doel te bereiken...?

My personal website


  • markvt
  • Registratie: Maart 2001
  • Laatst online: 08-05 14:41

markvt

Peppi Cola

open tekstbestand
replace oudezin nieuwezin
schrijf terug

Je verwacht toch geen hapklare code ??

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • ÜberWicked
  • Registratie: Oktober 2004
  • Laatst online: 09-05 18:21
OZ-Gump schreef op dinsdag 15 maart 2005 @ 11:33:
Het bestand openen, de tekst inlezen en de te vervangen tekst vervangen door de nieuwe, gewenste tekst.

Ik mis een beetje wat je doel is en wat je zelf al geprobeerd hebt om dat doel te bereiken...?
Het probleem, lijkt mij, het bestand bestaat uit 1 lange regel.
Als ik het bestand open, en lees, leest visual basic die regel in 1 keer, lijkt me niet echt handig, aangezien het 1 aardig groot bestand is.

En als ik daar dan nog die tekenreeks in moet zoeken?

Dus ik zocht een standaard manier om config files (.cfg) te benaderen. Bv. Net als een .ini?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Staat de tekst aan het begin dan gewoon char voor char inlezen vanaf begin. Staat het aan het eind dan char voor char inlezen vanaf einde.

Maar mooiste is gewoon hele regel inlezen, maar als dit erg groot is dan kan het een probleem worden...

  • markvt
  • Registratie: Maart 2001
  • Laatst online: 08-05 14:41

markvt

Peppi Cola

dan plaats je het toch in het werkgeheugen kan niet indenken dat die file daar niet inpast en replace je dan.

Iedere .cfg file is weer anders de meeste zijn trouwens bijna net zo opgebouwd als ini files.

[ Voor 31% gewijzigd door markvt op 15-03-2005 11:43 ]

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • ÜberWicked
  • Registratie: Oktober 2004
  • Laatst online: 09-05 18:21
Gomez12 schreef op dinsdag 15 maart 2005 @ 11:42:
Staat de tekst aan het begin dan gewoon char voor char inlezen vanaf begin. Staat het aan het eind dan char voor char inlezen vanaf einde.

Maar mooiste is gewoon hele regel inlezen, maar als dit erg groot is dan kan het een probleem worden...
Deze regel bestaat uit 4090 tekens.
Maar ik zal het eerst proberen door het in te lezen en dan te bewerken.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
4090 tekens is toch zo in te lezen??? Dit is toch niet groot... Ik zat meer aan MB's te denken. Gewoon in 1 keer inlezen , dan veranderen en dan weer wegschrijven.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

ÜberWicked schreef op dinsdag 15 maart 2005 @ 11:47:
[...]
Deze regel bestaat uit 4090 tekens.
Maar ik zal het eerst proberen door het in te lezen en dan te bewerken.
4090 tekens in 't geheugen van je systeem is peanuts. Lees de regel in en doe een zoek & vervang actie op de te vervangen tekst. Schrijf vervolgens de regel terug naar het bestand. De regel staat ook nog eens zo kort in je geheugen dat, als je systeem er al last van zou hebben, dat ook nog eens extreem kort is. Ik zie dan ook geen reden om dit anders aan te pakken dan zo...

Karakter voor karakter inlezen is volgens mij zwaarder dan in een keer de hele regel op te pikken. Eventueel alternatieve oplossing zou kunnen zijn om blokken tekst in te lezen van bijvoorbeeld 200 karakters met een overlap van X karakters. Zo kun je zoeken op de eerste X karakters van datgene wat je zoekt en weet je dus ook redelijk snel waar de complete string zou moeten staan.

My personal website


  • ÜberWicked
  • Registratie: Oktober 2004
  • Laatst online: 09-05 18:21
ok, bedankt voor alle hulp

Het is nu gelukt.

Hier de code voor als iemand eenzelfde vraag heeft:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub Form_Load()

    Dim FF As Integer
    Dim strTMP As String
    Dim lRes As Long
    
    lRes = -1                       'Initialiseer return waarde
    If Len(Dir("C:\Documents and Settings\user\Bureaublad\TEST\IDAPI32.cfg")) > 0 Then   'Bestaat het bestand?
        FF = FreeFile               'Vraag een vrije filehandle aan
        Open "C:\Documents and Settings\user\Bureaublad\TEST\IDAPI32.cfg" For Binary As #FF
        strTMP = String(LOF(FF), Chr(0))    'Initialiseer temp string op lengte van bestand met 0-en
        Get #FF, , strTMP                   'Lees het hele bestand in de string
        Close #FF
        Text1.Text = strTMP
        MsgBox InStr(1, strTMP, "c:\win\OldBase\Vips2000.gdb", iCompareMethod)    'Zoek naar het zoekwoord
    End If


strTEMP = Replace(strTMP, "c:\win\OldBase\Vips2000.gdb", "pompiedom")

MsgBox InStr(1, strTEMP, "pompiedom")

Open "C:\Documents and Settings\jleliveld\Bureaublad\TEST\IDAPI32_n.cfg" For Binary As #1
     Put #1, , strTEMP
Close


End Sub


ik open het bestand, stop de eerste regel in een variabel, replace de string, en stop de regel terug in een ander bestand.

[ Voor 6% gewijzigd door ÜberWicked op 15-03-2005 13:40 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
OZ-Gump schreef op dinsdag 15 maart 2005 @ 12:07:
[...]

Karakter voor karakter inlezen is volgens mij zwaarder dan in een keer de hele regel op te pikken. Eventueel alternatieve oplossing zou kunnen zijn om blokken tekst in te lezen van bijvoorbeeld 200 karakters met een overlap van X karakters. Zo kun je zoeken op de eerste X karakters van datgene wat je zoekt en weet je dus ook redelijk snel waar de complete string zou moeten staan.
Is ook veel en veel zwaarder, maar als je in een bestand van 50 MB iets wil veranderen en je weet dat het in de 1e 2% of de laatste 2% staat kan het heel lonend zijn om het gewoon char voor char in te lezen( c.q. blok voor blok maar wat is het blok voor een pad ik kan wel een pad definieren van c:\i.mdb dan kan jij wel leuk blokken van 200 chars gaan zitten nemen, maar dan mis je hem. )
Als je echt helemaal niets van het bestand afweet dan heb je gewoon een probleem bij grote bestanden ( en hier bedoel ik dus geen 4090 bytes mee... )

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

( c.q. blok voor blok maar wat is het blok voor een pad ik kan wel een pad definieren van c:\i.mdb dan kan jij wel leuk blokken van 200 chars gaan zitten nemen, maar dan mis je hem. )
Huh :?
Als je blokken van 200 karakters inleest met een overlap van 10 karakters, en je controleert dan de blokken helemaal, dan controleer je alle karakters plus de overlap tweemaal. Die opmerking snap ik dus niet...

My personal website


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Dacht meer dat je iets bedoelde in de trant van pak karakter 1,201,401,601 etc. Dus meer steeksproefsgewijs totdat je eenbekend teken tegenkomt en hier omheen gaan zoeken. Maar ok was ff verkeerd begrepen.

  • Devion
  • Registratie: Januari 2000
  • Laatst online: 08-01 16:02

Devion

Space for rent ;-)

VB's open "" for binary kun je 't beste gewoon per 512KB ophalen (byte array of string), dan is iig Instr, mid$, etc alles nog snel.. 200 chars is waarschijnlijk langzamer :p

  • ÜberWicked
  • Registratie: Oktober 2004
  • Laatst online: 09-05 18:21
Hallo,

het is nog niet helemaal gelukt, namelijk, doordat ik het bestand open en weer wegschrijf, word er door de code een 3-tal tekens vooraf bijgeschreven.

Hierdoor herkent het programma wat met het .cfg betand moet werken zijn eigen bestand niet meer.

Vooraf ziet het .cfg bestand er zo uit:

Afbeeldingslocatie: http://nicolaasboys.nl/test/GoT/1.gif

Nadat ik een replace heb uitgevoerd d.m.v. de code uit mijn vorige post, ziet het bestand er zo uit:
(Wat omvierkant is, is er bij gezet door de code)

Afbeeldingslocatie: http://nicolaasboys.nl/test/GoT/2.gif

Wie weet waardoor dit komt, en of ik mischien een andere benadering moet gebruiken voor het bestand.

  • Sikkek
  • Registratie: Maart 2004
  • Laatst online: 10-05 11:11
Gebruik niet get en put, maar line input #FF en print #FF. Put schrijft een record weg met een record lengte indicator, geloof ik... De help van VB kan hier prima uitkomst bieden!

Verwijderd

Sikkek schreef op vrijdag 18 maart 2005 @ 14:31:
Gebruik niet get en put, maar line input #FF en print #FF. Put schrijft een record weg met een record lengte indicator, geloof ik... De help van VB kan hier prima uitkomst bieden!
Er is ook nog zoiets als de windows scripting host. Hier zit het FileSystemObject in. Hiermee kan je nog veel makkelijker bestanden openen als textstream en er allerlei bewerkingen op uitvoeren.

  • Equator
  • Registratie: April 2001
  • Laatst online: 10-05 16:05

Equator

Crew Council

#whisky #barista

Het FileSystemObject bestaat ook in VB.

Maar inderdaad het is vrij simpel om hiermee de textline uit te lezen./schrijven.

  • ÜberWicked
  • Registratie: Oktober 2004
  • Laatst online: 09-05 18:21
Sikkek schreef op vrijdag 18 maart 2005 @ 14:31:
Gebruik niet get en put, maar line input #FF en print #FF. Put schrijft een record weg met een record lengte indicator, geloof ik... De help van VB kan hier prima uitkomst bieden!
Superbedankt, ik gebruik nu Print, en het werkt vlekkeloos.
Pagina: 1