Avatar billede johncleese Nybegynder
02. juni 2006 - 00:06 Der er 17 kommentarer og
1 løsning

søge efter en streng i tekst fil

hejsa

jeg er igang med at lave et script der går igennem en tekstfil og tjekker for en dato streng i en tekst fil og hvis datoen er over en måned gammel skal den næste lije slettes og kører videre igennem tekstfilen for at tjekker om der er andre steder i filen hvor dato er ældre end en måned og igen slette næste linje.

f.eks så ser et udkast fra tekst filen således ud

DATO= 12-10-03
Slettes

DATO= 22-11-05
også slettes

DATO= 01-06-06
IKKE SLETTEES

osv osv osv
Avatar billede killerclown Nybegynder
02. juni 2006 - 08:29 #1
Hej !
Er det nøjagtig sådan det ser ud i txt filen.
Altså "DATO= 12-10-03" eksempelvis eller er det kun datoen, der står der ?
/Killer
Avatar billede killerclown Nybegynder
02. juni 2006 - 09:51 #2
Dette script åbner c:\datoer tjekker om måneden er mindre end den aktuelle måned.
Bemær, den kun tjekker på måneden. Du kan evt. tjekke på antal dage, eller både måned og dag, hvis det skal være nøjagtigt 1 måned :)

Derefter laver det en ny fil der hedder c:\nyedatoer, og putter resultatet ind der.

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
strtekst = strtekst & strNextLine & VbCrLf
If InStr(strnextline,"DATO= ")Then
dato = replace(strnextline,"DATO= ","")
wscript.Echo DateDiff("m",Date , dato)
If DateDiff("m",Date , dato) < 0 Then
strNextLine = objTextFil.Readline
End If
End If
Loop
Set destobjTextFil = FSO.OpenTextFile ("c:\nyedatoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close

/Killer
Avatar billede johncleese Nybegynder
02. juni 2006 - 11:36 #3
Killer.. Kan man ikke bare smide den over i den samme fil? og hvad skal man gøre hvis den skal slette de to næste linjer i filen?
Avatar billede killerclown Nybegynder
02. juni 2006 - 12:21 #4
Det du kan gøre er, at lade scriptet slette og oprette filen igen.
Hvis du også gerne vil af med den næste line, sætter du bare en strNextLine = objTextFil.Readline ekstra ind.

Her er så scriptet :

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
strtekst = strtekst & strNextLine & VbCrLf
If InStr(strnextline,"DATO= ")Then
dato = replace(strnextline,"DATO= ","")
wscript.Echo DateDiff("m",Date , dato)
If DateDiff("m",Date , dato) < 0 Then
strNextLine = objTextFil.Readline
strNextLine = objTextFil.Readline

End If
End If
Loop
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close

/Killer
Avatar billede johncleese Nybegynder
02. juni 2006 - 13:10 #5
hej Killer.
okey tak for det :)  der er lige en lille ting til så er den som det skal være,
selve dato linjen skal også slettes.. men jeg har lige lidt svært ved at få den linje slettet..
det må denne her     dato = replace(strnextline,"DATO= ","")
der skal laves om er det ik?
Avatar billede killerclown Nybegynder
02. juni 2006 - 14:35 #6
Er det det her, du tænker på ??

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
strtekst = strtekst & strNextLine & VbCrLf

If InStr(strnextline,"DATO= ")Then
    dato = replace(strnextline,"DATO= ","")
    wscript.Echo DateDiff("m",Date , dato)
    If DateDiff("m",Date , dato) < 0 Then
        strNextLine = objTextFil.Readline
        strNextLine = objTextFil.Readline
    End If
End If

Loop
strtekst = Replace (strtekst,"DATO= ","")
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close
Avatar billede johncleese Nybegynder
02. juni 2006 - 15:00 #7
jah det er det jeg mener. men det vil sige at man bliver nød til at gøre det over to gange at løbe filen igennem igen efter man har gjort det andet først`?
Avatar billede killerclown Nybegynder
02. juni 2006 - 15:09 #8
Det her kan helt sikkert gøres pænere, men det virker da :o)

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
strtekst = strtekst & strNextLine & VbCrLf

If InStr(strnextline,"DATO= ")Then
    dato = replace(strnextline,"DATO= ","")
    wscript.Echo DateDiff("m",Date , dato)
    If DateDiff("m",Date , dato) < 0 Then
        strtekst = Replace(strtekst,strNextLine,"")
        strNextLine = objTextFil.Readline
        strNextLine = objTextFil.Readline
       
    End If
End If

Loop
strtekst = Replace (strtekst,"DATO= ","")
strtekst = Replace (strtekst,VbCrLf & VbCrLf,"")
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close

/Killer
Avatar billede killerclown Nybegynder
02. juni 2006 - 15:46 #9
Her er der lige en, der er lidt pænere sat sammen :o)

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
If InStr(strnextline,"DATO= ")Then
    dato = replace(strnextline,"DATO= ","")
    If DateDiff("m",Date , dato) > 0  Or DateDiff("m",Date , dato) = 0 Then
        strtekst = strtekst & dato & VbCrLf
        strtekst = strtekst & objTextFil.Readline & VbCrLf       
    End If
End If
Loop
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close
Avatar billede johncleese Nybegynder
02. juni 2006 - 22:18 #10
hey killerclown..
jeg har ikke lige været hjemme endnu. men jeg glæder mig til at prøve dit eksempel af. jeg er sku glad for at du kan fikse den..  foresten fedt det med inStr funktionen. det er noget lignende KIX script vidste ikke man kunne gøre det i vbs :) jeg vender tilbage så snart jeg har prøvet det :D
Avatar billede killerclown Nybegynder
03. juni 2006 - 00:07 #11
Fint fint.
Jep, vbs er et ekstremt godt værktøj til næsten enhver lejlighed.
Rent funktionsmæssigt minder vbs ret meget om kix
Avatar billede johncleese Nybegynder
06. juni 2006 - 23:35 #12
hey killerclown.
jeg syns ikke rigtig det virker det der.. jeg kan se nu at du har gjort så den kommer i den samme fil. cool!. men jeg kan ikke rigtig få den til at slette det rigtige den skal slette.. altså : det er således Tekstfilen ser ud inden der bliver slettet:

DATO= 01-01-2004
if $Placering = "Facit"
Run('%COMSPEC% /C %windir%\system32\rundll32.exe printui.dll PrintUIEntry /dn /n \\test\test /q')
endif

DATO= 29-05-2006
if $Placering = "test"
Run('%COMSPEC% /C %windir%\system32\rundll32.exe printui.dll PrintUIEntry /dn /n \\test\test /q')
endif

DATO= 01-01-2005
if $Placering = ""
Run('%COMSPEC% /C %windir%\system32\rundll32.exe printui.dll PrintUIEntry /dn /n \\test\test /q')
endif

og således ser den ud når den har tjekket for den rigtige dato

DATO= 29-05-2006
if $Placering = "test"
Run('%COMSPEC% /C %windir%\system32\rundll32.exe printui.dll PrintUIEntry /dn /n \\test\test /q')
endif

jeg har fået til den til næsten at virke men helt godt er det ikke så bliver der stadig noget tilbage når jeg kører den f.eks dato feltet kan jeg ikke fjerne. hmm
Avatar billede killerclown Nybegynder
07. juni 2006 - 08:39 #13
Hey johncleese !
Hvis det er nøjagtig sådan syntaxen er i tekstfilen, så prøv dette :

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
If InStr(strnextline,"DATO= ")Then
    dato = replace(strnextline,"DATO= ","")
    If DateDiff("m",Date , dato) > 0  Or DateDiff("m",Date , dato) = 0 Then
        strtekst = strtekst & objTextFil.Readline & VbCrLf       
        strtekst = strtekst & objTextFil.Readline & VbCrLf
        strtekst = strtekst & objTextFil.Readline & VbCrLf
    End If
End If
Loop
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close

/Killer
Avatar billede johncleese Nybegynder
07. juni 2006 - 22:36 #14
hey killer :D
det fungere bare lige som det skal nu. tak for det killer. yeeehaaa!! hehe :)
Avatar billede killerclown Nybegynder
07. juni 2006 - 22:57 #15
hehe ... cool :o)
Så får du lige et svar ...

/Killer
Avatar billede johncleese Nybegynder
08. juni 2006 - 09:51 #16
værsgo :) lige et hurtig spørgsmål til hehe.
i bunden af tekstfilen tilføjer den lige en linjeskift for meget. hvergang scriptet kører. det syns jeg er lidt underlligt. hvordn ka det være
Avatar billede killerclown Nybegynder
08. juni 2006 - 09:56 #17
Arh ja :o)
Prøv denne :
Så indsætter den kun linebreak, hvis der rent faktisk kommer et nyt afsnit :o)

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
If InStr(strnextline,"DATO= ")Then
    dato = replace(strnextline,"DATO= ","")
    If DateDiff("m",Date , dato) > 0  Or DateDiff("m",Date , dato) = 0 Then
      strtekst = strtekst &  VbCrLf &  objTextFil.Readline & VbCrLf       
        strtekst = strtekst & objTextFil.Readline & VbCrLf
        strtekst = strtekst & objTextFil.Readline
    End If
End If
Loop
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close

/Killer
Avatar billede killerclown Nybegynder
08. juni 2006 - 09:59 #18
Og med denne slipper du for ekstra linebreak i toppen også :))

Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForAppending = 8
Set objTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForReading)
Do Until objTextFil.AtEndOfStream
strNextLine = objTextFil.Readline
If InStr(strnextline,"DATO= ")Then
    dato = replace(strnextline,"DATO= ","")
    If DateDiff("m",Date , dato) > 0  Or DateDiff("m",Date , dato) = 0 Then
    i = i+1
    If i = 1 Then
      strtekst = strtekst &  objTextFil.Readline & VbCrLf       
    Else
      strtekst = strtekst & VbCrLf &  objTextFil.Readline & VbCrLf       
    End if
        strtekst = strtekst & objTextFil.Readline & VbCrLf
        strtekst = strtekst & objTextFil.Readline
    End If
End If
Loop
objTextFil.Close
fso.DeleteFile "c:\datoer.txt"
Set destobjTextFil = FSO.OpenTextFile ("c:\datoer.txt", ForAppending,1)
destobjtextfil.WriteLine(strtekst)
destobjTextFil.Close

/Killer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester