[VB] Per lijn een stukje tekst verwijderen

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

  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Hey, ik ben nogal een leek in VB, maar het lijkt me wel handig om een kleine app te programmeren icm met m'n zojuist opgezette RaidenFTPD.

RaidenFTPD creeert een newdir.dat bestand, waar de laatste 10 geuploade directories in te zien zijn.

Een voorbeeld:
2004/03/28:17:41 thunk /07_ Upload/Admin/Phase_2-Voodoo_Love-Promo-CDS-2004-UTE

Nu wil ik het stuk vanaf /07 t/m admin/ weghalen, zodat alleen de eigenlijke directory overblijft (een stuk overzichtelijker bij de welcome login msg).

Ik weet wel hoe ik een txt file kan openen en opslaan ed, kan er alleen niet achterkomen hoe ik per zin alles vanaf en tussen de 3e "/" en 5e "/" weghaal.

Any help would be appreciated :)

  • Flard
  • Registratie: Februari 2001
  • Laatst online: 26-05 10:11
Gewoon werken met twee files:
eentje die de oude (newdir.dat) uitleest, en een andere die een nieuwe index voor je maakt (zou je bijvoorbeeld newdir.txt of welcome.txt kunnen noemen).

Daarna lees je uit de ene file steeds een regel tot het einde (EOF) en schrijf je deze (aangepast) in de andere file.

En het weghalen zou je bijvoorbeeld kunnen doen met Left(s, InStr(s, "/") - 1) & Mid(s, InStrRev(s, "/") + 1), mocht je geen regexp willen gebruiken.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Daar zijn een heleboel verschillende manieren voor. Het kan moeilijk, makkelijk, etz. Hangt af van wat voor hulpmiddelen je tot je beschikking hebt en hoeveel kennis je er van hebt.

Ik heb bijv. maar weinig VB-kennis, maar ik zou je zeggen wat ik zou doen:
op zoek gaan naar een manier om regel voor regel dat bestand in te lezen. Op zoek gaan naar een functie waarmee je stukken uit een tekst kan knippen (bijvoorbeeld iets als substr, substring of iets dergelijks). En op zoek gaan naar een functie om de positie van een stukje tekst in een andere tekst te vinden, of eventueel een functie om een stukje tekst te knippen op een bepaald character.

Als je dat weet dan kan je dit probleem oplossen. Dit is niet de meest mooie manier en waarschijnlijk ook niet de meest makkelijke, maar ik weet wel dat je met weinig kennis van een programmeertaal, iets als dit wel kan realiseren.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Bekijk de replace functie anders eens?

/matsmode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Sub ReplaceStringInFile(strFile As String, _
                    strFind As String, strReplace As String, _
                    Optional iCompareMethod As VbCompareMethod = vbTextCompare)
    Dim FF As Integer
    Dim strTMP As String
    
    If Len(Dir(strFile)) > 0 Then   'Bestaat het bestand?
        FF = FreeFile               'Vraag een vrije filehandle aan
        Open strFile For Binary As #FF      'Open bestand
        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                           'Sluit bestand
        
        strTMP = Replace(strTMP, strFind, strReplace,,,iCompareMethod)   'Replace
        
        FF = FreeFile               'Vraag een vrije filehandle aan (weer :P )
        Open strFile For Output As #FF  'Klaar voor output?
        Print #FF, strTMP               'Schrijven die hap!
        Close #FF                       'Sluiten weer!
    End If
End Sub


Nu nog een kwestie van aanroepen :)

code:
1
ReplaceStringInFile "C:\MyDir\MyFile.txt","/07_ Upload/Admin/",""


Woila :P


Disclaimer: Uit de losse pols, maar dit moet werken

[ Voor 19% gewijzigd door RobIII op 28-03-2004 21:05 ]

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


  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Wiee, ben jij even lief :)
Even testen hoor. Anders moet het me iig gaan lukken met deze basis :) Thanks..

  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Working perfectly :)
Alleen , "/07 _ Upload/xxxx/"

xxxx = variabele user. is het makkelijk te implementeren om alles tussen "/07 _ Upload/ /" te strippen, of zou t handiger zijn om voor iedere user de functie aan te roepen?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt er een regular expression op los laten, maar dan moet je de functie wat aanpassen. Als je maar 2 users hebt ofzo, zou ik gewoon de functie 2 keer aan roepen (tenzij je file heel groot is). Efficiënt is anders, maar wel makkelijk ;)

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


  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Thanx :) Ik heb gewoon de nodige lijnen toegevoegd, zijn niet meer dan 10 users (en max 10 nieuwe dirs) dus :)

Maar nog 1 ding, in FTP client als t lange release dirs zijn, staat een beetje lelijk (word wrap).

Hoe kan ik eventueel PER lijn na exact 71 tekens de zin verder afknippen?

Verwijderd

Thunk schreef op 29 maart 2004 @ 16:20:
Thanx :) Ik heb gewoon de nodige lijnen toegevoegd, zijn niet meer dan 10 users (en max 10 nieuwe dirs) dus :)

Maar nog 1 ding, in FTP client als t lange release dirs zijn, staat een beetje lelijk (word wrap).

Hoe kan ik eventueel PER lijn na exact 71 tekens de zin verder afknippen?
Het Nederlandse woord voor 'line' is 'regel'...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Thunk schreef op 29 maart 2004 @ 16:20:
Thanx :) Ik heb gewoon de nodige lijnen toegevoegd, zijn niet meer dan 10 users (en max 10 nieuwe dirs) dus :)

Maar nog 1 ding, in FTP client als t lange release dirs zijn, staat een beetje lelijk (word wrap).

Hoe kan ik eventueel PER lijn na exact 71 tekens de zin verder afknippen?
strKort = Left(strLang,71) :?

Lees anders de help eens, of een goeie tutorial. Ik wil je best op weg helpen zoals je hebt ervaren, maar ik, en wij, verwachten wel een beetje eigen inzet van je hier @GoT. Dit is allemaal erg basic hoor...

[ Voor 3% gewijzigd door RobIII op 29-03-2004 16:28 ]

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


  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Verwijderd schreef op 29 maart 2004 @ 16:22:
[...]


Het Nederlandse woord voor 'line' is 'regel'...
Taalpurist?
RobIII schreef op 29 maart 2004 @ 16:27:
[...]

strKort = Left(strLang,71) :?

Lees anders de help eens, of een goeie tutorial. Ik wil je best op weg helpen zoals je hebt ervaren, maar ik, en wij, verwachten wel een beetje eigen inzet van je hier @GoT. Dit is allemaal erg basic hoor...
OK Klopt sorry, beetje te basic. Zal next time wel even verder kijken dan m'n neus lang is :) Ben beetje lui vandaag, 2 uur geslapen 8)7

Excuse me :) En bedankt voor de hulp.

  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Ben ff zelf aan t knutselen gegaan,

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub Form_Load()
Dim sContents() As String
Dim a As Integer

spath = "D:\Apps\RaidenFTPD\VirtualFS\Thunk\newdir.dat"
a = 0
Open spath For Input As #1
Do While Not EOF(1)
    Line Input #1, x
    sContents(a) = Left(x, 71)
 a = a + 1
Loop
Close #1

Kill spath

Open spath For Append As #1
For a = 0 To UBound(sContents())
    Print #1, sContents(a)
Next a
Close #1
End Sub
Ik zie niet meer wat hier mis aan is =(
Krijg een subscript out of range error bij sContents(a) = Left(x, 71).
Wat doe ik fout? Wat kan ik verbeteren?

Verwijderd

Ik lees+schrijf geen VB maar als die directory constant is (altijd dezelfde hoeveelheid sub directories) dan kan je toch gewoon slashes tellen?

Bij de 2 stop je met toevoegen aan je string. Na de 5e ga je weer verder met toevoegen.

Edit:

Was een tikkeltje rude :)

Maar vind je het geen goed idee :Y) ?

[ Voor 23% gewijzigd door Verwijderd op 29-03-2004 23:38 ]


  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Ja hoor prima idee. Was op het moment van schrijven erg moe en lui, had ik al mn excuses voor aangeboden. Heb vanavond zelf lopen knutselen maar ik loop nog steeds vast (zoals je kan zien in post hierboven). Heb zelf ook heus wel gezocht naar oplossingen :x

[ Voor 83% gewijzigd door Thunk op 29-03-2004 23:59 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
• a) Je dimt je array als (), dus geen dimensies. Je kunt niet straffeloos (als in bijvoorbeeld JavaScript) gewoon je array gaan vullen. Kijk eens naar ReDim of Redim Preserve. Als je de foutmelding goed had gelezen, of desnoods de foutmelding in de help had opgezocht was je daar zelf achter gekomen.

• b) De methode die je nu gebruikt is niet erg efficiënt. Dit lijkt me sneller & beter:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Option Explicit

Private Sub Form_Load()
    Dim strFileContents As String
    Dim arrTMP() As String
    Dim L As Long
    
    Const cLineDelimiter = vbCrLf   'Regels worden gescheiden door een CrLf
    
    strFileContents = LoadFile("C:\myDir\MyFile.txt")   'Lees bestand
    
    arrTMP = Split(strFileContents, cLineDelimiter)     'Split het bestand in regels
    For L = 0 To UBound(arrTMP)
        'Replace ongewenste strings
        arrTMP(L) = Replace(arrTMP(L), "/07_Upload/Admin/", "", , , vbTextCompare)
        arrTMP(L) = Replace(arrTMP(L), "/09_Jedda/Jantje/", "", , , vbTextCompare)
        arrTMP(L) = Replace(arrTMP(L), "/51_Blaat/Pietje/", "", , , vbTextCompare)
        
        arrTMP(L) = Left(arrTMP(L), 71)    'Strings afkappen op 71 chars
    Next
    strFileContents = Join(arrTMP, cLineDelimiter)      'Join de regels weer
    
    If SaveFile("C:\mydir\myfile.txt", strFileContents) Then
        MsgBox "Bestand succesvol opgeslagen", vbInformation
    Else
        MsgBox "Fout bij opslaan bestand!", vbCritical
    End If
End Sub

Public Function LoadFile(strFileName As String)
    'Laadt een file in 1 klap in een string.
    'Geeft een lege string als bestand niet bestaat
    Dim strTMP As String
    Dim FF As Integer
    
    strTMP = ""                             'Inhoud initialiseren
    If Len(Dir(strFileName)) > 0 Then        'Bestaat het bestand?
        FF = FreeFile                       'Vraag een vrije filehandle aan
        Open strFileName For Binary As #FF  'Open bestand
        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                           'Sluit bestand
    End If
    LoadFile = strTMP                       'Inhoud teruggeven
End Function

Public Function SaveFile(strFileName As String, strContent As String) As Boolean
    'Saved een string in een file in 1 klap
    Dim FF As Integer
            
    SaveFile = False                'We gaan er van uit dat het fout gaat :-)
    On Error GoTo errSaveFile
    FF = FreeFile                   'Vraag een vrije filehandle aan (weer :P )
    Open strFileName For Output As #FF  'Klaar voor output?
    Print #FF, strContent               'Schrijven die hap!
    Close #FF                       'Sluiten weer!
    SaveFile = True                 'Het is goedgegaan! WOEI!

errSaveFile:
End Function


De code bevat een LoadFile functie die het bestand in een string plempt, een SaveFile functie die de string weer in het bestand plempt en een loopje waarin je je replaces en afkappen van de strings uitvoert.

• c) Een regular expression kan dit waarschijnlijk nog mooier en sneller oplossen, maar die ga ik nu écht niet meer schrijven. Het is ook voor mij al laat en een regex schudt (zelfs ;) ) ik niet zomaar uit me mouw.
Thunk schreef op 29 maart 2004 @ 23:34:
Ja hoor prima idee. Was op het moment van schrijven erg moe en lui, had ik al mn excuses voor aangeboden. Heb vanavond zelf lopen knutselen maar ik loop nog steeds vast (zoals je kan zien in post hierboven). Heb zelf ook heus wel gezocht naar oplossingen :x
• d) Met de klem-toon op lui. En als je moe bent dan moet je rusten en er dan nog eens naar kijken. Ik heb het je nu écht helemaal voorgekauwd. Nogmaals: Bekijk eens een tutorial, koop of lees een boek en bestudeer de helpfile eens. Dit is toch écht erg basic programmeerwerk. Succes ermee!

Let op! Als je bestanden groter dan een paar meg worden, dan kun je beter in blokken gaan werken van, zeg, 1 meg ofzo. Hiermee voorkom je dat je in 1 klap een bestand van 2 gig "per-ongeluk" in je geheugen leest. Vindt windows (en VB overigens ook) niet erg leuk. Bestanden lezen in blokken heb ik hier al méér dan eens gedemonstreerd. De methode daarvoor is makkelijk af te leiden uit deze post of uit het zipje uit deze post.

[ Voor 67% gewijzigd door RobIII op 30-03-2004 02:03 ]

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


  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Dankjewel. Ander VB werk gaat me redelijk makkelijk af, ik doorzie alleen file handling nog niet goed (ik kan t zeg maar niet goed zelf uit mn mouw schudden).
Ik heb je code bestudeerd en deze snap ik ook wel volledig.

Het bestand is nooit groter dan 10 regels dus het laatste gaat niet op.

Ik kreeg alsnog een runtime error 13 'type mismatch' op de volgende regel:

code:
1
 arrTMP(L) = Left(arrTMP, 71)


Zag t eerst niet, maar je bent een (L) vergeten bij Left(arrTMP, 71) :)
Verder bedankt, zal me voortaan echt eerst nog meer verdiepen :)

Good night!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Thunk schreef op 30 maart 2004 @ 00:56:
Ik kreeg alsnog een runtime error 13 'type mismatch' op de volgende regel:

code:
1
 arrTMP(L) = Left(arrTMP, 71)


Zag t eerst niet, maar je bent een (L) vergeten bij Left(arrTMP, 71) :)
Niettes ;)

Succes ermee, en truste!

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


  • Thunk
  • Registratie: Maart 2002
  • Laatst online: 02-03 17:41
Hey, ben nog steeds aan het knutselen :)

Het lukt allemaal nu aardig, heb ook ingevoegd dat ie de array 1 voor 1 uitleest, spaties toevoegt tot en met 70, en voor 71 een pipeline, zodat bij de ftp client zo uit komt te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
230-The server will deny access if you connect more than 2 times.
230-
230-.-------+----------+----------+-----------------+---------------------:
230-|              Latest created directories on this server              |
230-:-------+----------+----------+-----------------+---------------------:
230-|2004/03/30:02:12 thunk    Tone_Depth_-_Absynth-Promo_CDR-2004-iDC    |
230-|2004/03/30:02:12 thunk    Stonebridge_Ft_Therese-Put_Em_High-HEDK1-20|
230-|2004/03/30:02:12 thunk    Marvin_Gaye-I_Want_You-MG007-RMX-PROMO_CDS-|
230-|2004/03/30:02:12 thunk    Kid_Alex_-_My_Way-Promo-Vinyl-2004-SQ      |
230-|2004/03/30:02:12 thunk    Electric_Funk-Electric_Funk-Promo_Vinyl-200|
230-|2004/03/30:02:12 thunk    Chab_Feat_Jd_Davis-Closer_To_Me-Promo-CDS-2|
230-|2004/03/30:02:12 thunk    Cess_-_Desire-(ALM001)-Vinyl-2004-NBD      |
230-|2004/03/30:02:12 thunk    Asad_Rizvi_Ft_Mel_Dymond_-_Slippery_Heights|
230-
230-:-------+----------+----------+-----------------+---------------------:
230-[latest 9 directories]


Hij voegt een regel te veel toe. Als het er minder dan 10 zijn laat ie er 1 te veel zien. Als er 10 in staan (met nog wat losse witregels erachteraan) dan leest raiden alleen de 1e 10 uit, dus da's goed.

Maar in dit voorbeeld zijn er 8,.. herkent ie als 9.. door die ene laatste witregel.
Ik heb al gedaan For L = 0 To (UBound(arrTMP) - 1).

Ben nog even aan het sleutelen geweest, maar het lukt me niet aan het eind van het proces die witregel weer weg te halen. Hoe kan ik dit voor elkaar krijgen?

Moet misschien maar ff naar bed gaan en morgen nog helder nadenken, voordat ik weer loze vragen stel :+ ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Schrijf je niet een CrLf teveel weg?

Probeer eens:
code:
1
Print #FF, strContent               'Schrijven die hap!


te vervangen door:
code:
1
Print #FF, strContent;              'Schrijven die hap!


Let op de puntkomma achter strContent. Hierdoor wordt er geen extra CrLf weggeschreven aan 't eind van het bestand.

En leer in godshemelsnaam een keertje debuggen...
Zet een breakpoint op het stuk code dat je wilt bekijken met F9, run de zooi, en stap er met F8 door heen. Je kunt dan precies zien wat 'ie doet en waarom. Zet desnoods wat watches of debug.print in je code. Wederom is dit erg basic.

Dit topic krijgt een Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/icon_hand.gif van me, puur omdat je inzet 0 komma 0 is. Overigens blijkt uit je historie dat je regelmatig op de help en Google wordt gewezen. Trek je er eens iets van aan zou ik zeggen :?

offtopic:
Latest zou ik vervangen door Last...
RobIII schreef op 30 maart 2004 @ 02:03:
Succes ermee, en truste!
En nu ga ik écht naar bed :+

[ Voor 82% gewijzigd door RobIII op 30-03-2004 03:17 ]

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


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

RobIII schreef op 30 maart 2004 @ 03:04:
En leer in godshemelsnaam een keertje debuggen...
Zet een breakpoint op het stuk code dat je wilt bekijken met F9, run de zooi, en stap er met F8 door heen. Je kunt dan precies zien wat 'ie doet en waarom. Zet desnoods wat watches of debug.print in je code. Wederom is dit erg basic.
^^^^^^^ !!!!!

Ik laat dit topic openstaan omdat er ondertussen veel informatie instaat die als naslagwerk interessant is, maar ik wil Thunk toch idd dringend verzoeken om een stuk meer eigen inzet te vertonen, ipv GoT als slowchat programmeerhulp te gebruiken.

Professionele website nodig?

Pagina: 1