dobihead
Goto Top

Problem mit Vb script beim suchen und speichern von bestimmten Abschnitt aus Textdatei

Hi,

ich beschäftige mich nun seit ca. einer Woche mit VB Script. Bin also ein ziemlicher Anfänger und wollte aus einer Textdatei einen bestimmten Abschnitt in einer neuen textdatei speichern.
Nun habe ich mir nach dem durchlesen vers. Tutorials udn Foren ein Vb Script zusammen bebaut. Doch dieses Funktioniert nicht.

Hier ist das script

Const forReading =1 

dim test, test1, head
Set fso = createObject("Scripting.FileSystemObject")  
Set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\3C.txt", true)  
Set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", forreading)  
test = "abc"  
do until test <> "PROE_FLEX3C"  
lizdatei.skipline
test = lizdatei.readline
exit do
loop
head = "PROE 3C Lizenzen"  
test1 = "cds"  
do until test1 = "PROE_FundationAdv"  

text = text + lizdatei.readline
test1 = lizdatei.readline

	exit do

loop
oStream.WriteLine head
oStream.WriteLine text
lizdatei.close
ostream.close


Ich habe versucht den Abschnitt zwischen PROE_FLEX3C und PROE_FundationAdv versucht in einer neuen Textdatei zuspeichern.
Aber ich habe nur PROE-FLEX3c drinnen stehen.

Ich hoffe ihr könnt mir helfen.
Vielen Danke schon mal im Vorraus.

Mfg Dobihead

Content-Key: 86123

Url: https://administrator.de/contentid/86123

Printed on: April 18, 2024 at 23:04 o'clock

Member: tacker
tacker Apr 22, 2008 at 14:13:32 (UTC)
Goto Top
salü!

lass ich deinen Scriptschnipsel durchlaufen, so krieg ich als output nur:

PROE 3C Lizenzen
"erste Zeile der lizakt.txt"  

dies ist jedoch nicht weiter verwunderlich, da du keine saubere schleife eingebaut hast, welche das ganze file absucht! die folgenden codezeilen generieren diesen output und alles andere wird eigentlich gar nicht beachtet!

head = "PROE 3C Lizenzen"   ' erste zeile die geschrieben wird  
...
text = text + lizdatei.readline  '  erste zeile die ausgelesen und niedergeschrieben wird  
...
oStream.WriteLine head
oStream.WriteLine text

hier ein funktionierender scriptschnipsel von mir - kannst ja ma vergleichen und bei bedarf fragen stellen!

dim fso 

set fso = createobject("Scripting.FileSystemobject")  
Set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\3C.txt", true)  
Set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", 1)  

ostream.writeline "PROE 3C Lizenzen"  

do while not lizDatei.AtEndOfStream
    line = lizdatei.readline()
    If instr(line, "PROE_FLEX3C") > 0 then  
        line = lizdatei.readline()
        do until instr(line, "PROE_FundationAdv") > 0  
           ostream.writeline line
           line = lizdatei.readline()
        Loop
    End If                    
Loop

lizdatei.close
ostream.close


gruss tacker
Member: Dobihead
Dobihead Apr 22, 2008 at 15:08:12 (UTC)
Goto Top
Danke dir Tacker.

Hat funktioniert, musste nur noch die instr funktion anpassen, das er den Textvergleich macht.

Noch mal für mich zum Verständis.
Es wird jede zeile bis zum ende der Datei eingelesen und in die variable line gespeichert, sobald der Suchwert vorkommt, speichert er die nächsten Zeilen in die neue Datei. Das macht er solange bis der zweite suchwert gefunden wurde. Ist das soweit richtig?

Ich hab da gleich nochmal ein Frage:

Ich bekomme eine String zurück, aus diesen möchte ich aber nur einen bestimmten wert in die datei schreiben. würde das gehen wenn ich die Bedinungen dafür in die schleife mit rein bringe?

wenn ja würde ich das probieren und dir das Script, zeigen fals es nicht geht.

Danke im vorraus für deine Antwort.

mfg Dobihead
Member: Dobihead
Dobihead Apr 22, 2008 at 15:43:58 (UTC)
Goto Top
So dass hätte ich dann auch geschafft. Ich in der zweiten Schliefe mit InStrRev und mid gearbeitet.

Das sieht dann so aus
dim fso 

set fso = createobject("Scripting.FileSystemobject")  
Set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\3C.txt", true)  
Set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", 1)  

ostream.writeline "PROE 3C Lizenzen"  

do while not lizDatei.AtEndOfStream
    line = lizdatei.readline()
    If instr(1, line, "PROE_FLEX3C", 1) > 0 then  
        line = lizdatei.readline()
        do until instr(1, line, "PROE_FoundationAdv", 1) > 0  
	   pos = InStrRev(line, "@")  
	   name = mid (line, pos, 10)
           ostream.writeline name
           line = lizdatei.readline()
        Loop
    End If                    
Loop

lizdatei.close
ostream.close

Nun hab ich das Problem, dass der Rückgabe String name immer unterschiedlich lang ist. Wenn ich bei mid den Wert auf den längsten String setze, dann bekomm ich bei kürzen zeichen mit, die ich nicht will.

Gibt es da ne andere Lösung bzw Funktion oder ähnliches?

mfg Dobi
Member: tacker
tacker Apr 22, 2008 at 17:34:04 (UTC)
Goto Top
n'abend!

gib doch ma ein beispiel, wie deine Datei "lizakt.txt" ungefähr aussieht und was du daraus genau haben willst!

Gruss tacker
Member: Dobihead
Dobihead Apr 22, 2008 at 22:05:51 (UTC)
Goto Top
naja meine txt sieht ungefähr so aus:

(xxxxxx@xxxxxxx) server adressen port usw....
(xxxxxx@xxxxxx) server adressen port usw....
(xxxxxx@xxxxxxxxx) server adressen port usw....

bekomme max 3 Einträge. Ich benötige nur die xxxxxx nach dem @. Habe heut abend mich noch mal damit beschäftigt. Ich denkle das die Lösugn ei Vergleich ist, aber wie mache ich den? gibt es da auch ein Funktion wie InStrRev?

Gruß Dobi
Member: tacker
tacker Apr 23, 2008 at 06:47:55 (UTC)
Goto Top
guten morgen!

halt dich doch einfach an ein eventuelles zweites zeichen, welches noch vorkommt, anhand welchem du dann mit der funktion mid() den endpunkt bestimmen kannst...

tacker
Member: Biber
Biber Apr 23, 2008 at 07:18:04 (UTC)
Goto Top
... ganz unelegant, aber ausreichend wäre....
[Annahme: line ist "(xxxxxx@xxxxxxx) server adressen port usw...."]
...
	   pos = InStrRev(line, "@")  
	   name = mid (line, pos, 10)
	   pos = InStrRev(name, ")")  
	   name = left (line, pos-1)
  ...

-oder, nicht ganz so hölzern-
...
	   pos = InStrRev(line, "@")  
	   name = mid (line, pos, InStrRev(line, ")"-1 )- pos)  
[...wie immer ungetestet]

Grüße
Biber
Member: Dobihead
Dobihead Apr 23, 2008 at 16:42:54 (UTC)
Goto Top
Ich danke euch beiden für eure Hilfe.
Hab das jetzt so gelöst.

dim fso 

set fso = createobject("Scripting.FileSystemobject")  
Set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\3C.txt", true)  
Set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", 1)  

ostream.writeline "PROE 3C Lizenzen"  

do while not lizDatei.AtEndOfStream
    line = lizdatei.readline()
    If instr(1, line, "PROE_FLEX3C", 1) > 0 then  
        line = lizdatei.readline()
        do until instr(1, line, "PROE_FoundationAdv", 1) > 0  
	   posv = InStrRev(line, "@")  
	   posh = InStrRev(line, ")")  
	   name = mid (line, posv+1, posh-posv)
           ostream.writeline name
           line = lizdatei.readline()
        Loop
    End If                    
Loop

lizdatei.close
ostream.close

Nun bin ich dabei das Datum und Zeit als Dateiname, wann die Datei erstellt wurde, verwendet wird. Das bekomme ich bestimmt auch hin. Es müsste doch mit date und Time funktionieren oder?

Gruß Dobihead
Member: Biber
Biber Apr 23, 2008 at 17:04:02 (UTC)
Goto Top
Moin dobihead,

An die Datei-Erstellungs/Änderungzeiten zu kommen ist kein Problem mehr, wenn Du schon das FileSystemObject instanziert hast und auch den Dateinamen weißt...
...
Set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", 1)  
... 
' lesen, anzeigen, ...  
...
lizdatei.close

Set f = fso.GetFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt")  
ostream.WriteLine "LizDatei vom " & f.DateCreated  ' oder .DateModified  

Grüße
Biber
Member: Dobihead
Dobihead Apr 23, 2008 at 19:33:55 (UTC)
Goto Top
 Set f =
 fso.GetFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt")  
 ostream.WriteLine "LizDatei vom "  
 & f.DateCreated  ' oder .DateModified  
 

Dabei überschreib ich doch meine vorhandene datei lizakt.txt oder? Wenn ja und ich die datei §c.txt ändern will, brauch ich das doch "nur" zu ersetzen oder?

Gruß Dobihead
Member: Biber
Biber Apr 23, 2008 at 20:00:03 (UTC)
Goto Top
Dabei überschreib ich doch meine vorhandene datei lizakt.txt oder?
Hätte ich Dir dann die GetFile()-Methode in die Hand gedrückt? *beleidigt guck*

Sorry, hatte falsch gelesen.
Ich dachte, du wolltest das Dateidatum der lizakt.txt in Deine oStream-Datei schreiben...

Nehme alles zurück
Biber
Member: tacker
tacker Apr 23, 2008 at 21:02:14 (UTC)
Goto Top
salü

ausgehend von deinem codeschnipsel einfach abändern auf...

dim fso 

set fso = createobject("Scripting.FileSystemobject")  
Set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\" & date() & "_" & time() & "_3C.txt", true)  
Set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", 1)  

ostream.writeline "PROE 3C Lizenzen"  

do while not lizDatei.AtEndOfStream
    line = lizdatei.readline()
    If instr(1, line, "PROE_FLEX3C", 1) > 0 then  
        line = lizdatei.readline()
        do until instr(1, line, "PROE_FoundationAdv", 1) > 0  
	   posv = InStrRev(line, "@")  
	   posh = InStrRev(line, ")")  
	   name = mid (line, posv+1, posh-posv)
           ostream.writeline name
           line = lizdatei.readline()
        Loop
    End If                    
Loop

lizdatei.close
ostream.close

die genaue formatierung wie du des brauchst kriegste bestimmt auch noch selber hin ;)

gruss tacker
Member: Dobihead
Dobihead Apr 25, 2008 at 06:42:41 (UTC)
Goto Top
Morgen,

hab das jetzt so gelöst. Nur mal das geänderte, sonst wird das immer so lang^^
dim fso
zeit= FormatDateTime (Now,  4)
zeit = replace (zeit, ":", "-")  
datum = year(now) & "-"  
datum = datum & month(now) & "-"   
datum = datum & day(now)

set fso = createobject("Scripting.FileSystemobject")  
set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\" & datum & "_" & zeit &  "_Flex3C.txt", true)  
.......


Aber aber noch das Problem, das der Monat nicht mit 04 sondern nur 4 angezeigt wird. aber daüfr find ich bestimtm auch noch ne Lösung.

Mfg Dobihead
Member: Dobihead
Dobihead Apr 25, 2008 at 07:01:24 (UTC)
Goto Top
Das ging schneller als gedacht. Hier ist mein kompletter Code, vllt bruacht das jemand anderes auch mal. Datums- und Zeitformatierung erfolgt nach den schema yyyy-mm-dd_hh-mm

dim fso
zeit = FormatDateTime (Now,  4)
zeit = replace (zeit, ":", "-")  
datum = year(now) & "-"  
datumwert = instr (month(now), "0")  
if datumwert = 0 then
	datum = datum & "0" & month(now)  
	else
	datum = datum  & month(now)
end if
datum = datum & "-" & day (now)  
msgbox test
msgbox datum
set fso = createobject("Scripting.FileSystemobject")  
set ostream = fso.createTextfile("D:\PTC\proiclient3.4\bin\start\" & datum & "_" & zeit &  "_Flex3C.txt", true)  

set lizDatei = fso.OpenTextFile("D:\PTC\proiclient3.4\bin\start\lizakt.txt", 1)  


ostream.writeline "PROE Flex 3C Lizenzen"  

do while not lizDatei.AtEndOfStream
    line = lizdatei.readline()
    If instr(1, line, "PROE_FLEX3C", 1) > 0 then  
        line = lizdatei.readline()
        do until instr(1, line, "PROE_FoundationAdv", 1) > 0  
	   posv = InStrRev(line, "@")  
	   posh = InstrRev(line, ")")  
	   name = mid (line, posv+1, posh-posv-1)
	   ostream.writeline name
           line = lizdatei.readline()
        Loop
    End If                    
Loop

lizdatei.close
ostream.close

danke nochmal an Biber und tacker für Ihre Hilfeund Unterstüzung bei der Problemlösung.

Mfg Dobihead