Jump to content

Zeile nach einem String auslesen und die nächste mitnehmen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

habe ein nettes anliegen wo ihr mir vielleicht helfen könnt. Bin nicht so erfahren was das scripten mit batch oder vbs betrifft.

 

Habe einen Logfile den ich gerne nach bestimmten sachen auslesen lassen möchte. mit batch geht es via Findstr.

 

Aber er soll mir nicht nur die zeile ausspucken wo das wort z.b "broken_cable" auftaucht sondern auch die nächst mögliche Zeile wo Plan_2345 drin steht.

 

Es geht sich darum das er in dem Logfile in eine Zeile einen fehler namens broken_conduit schreibt und in der nächst möglichen zeile steht die alternative drin wo der Fehler entstanden ist.

 

[09.01.2008 22:33:14] [info] [pta_merge_alternatives.pta_merge_alternatives:int!merge_view()] Datenbank gis - Alternative "|Engineering Design|PLAN_42380" - Projekt/Planung "521197 - Ausbau EFH Adenberg, Rafz": Merge durchgeführt.
1199914394:306	design_clerk using_alternative: {dc!21988}
[09.01.2008 22:33:31] [info] [pta_merge_alternatives.pta_merge_alternatives:int!merge_view()] Datenbank gis - Alternative "|Engineering Design|PLAN_42385" - Projekt/Planung "NVM_520829 - Bergdietikon, Waldeggstr. 6, Nb. EFH": Merge durchgeführt.
1199914411:196	design_clerk using_alternative: {dc!21990}
**** Warnung: Nach dem Änderungsaustausch hat das System den folgenden Datenfehler erkannt:

Unterbrochener Trassenverlauf des Rohres.

Korrigieren Sie bitte das Rohr.
    mit!mit_manager!post_merge_error_detected(error_type=:broken_conduit, error_description="Unterbrochener Trassenverlauf des Rohres.", cleanup_description="Korrigieren Sie bitte das Rohr.")
**** Warnung: Nach dem Änderungsaustausch hat das System den folgenden Datenfehler erkannt:

Unterbrochener Trassenverlauf des Kabelstücks.

Korrigieren Sie bitte das Kabelstück.
    mit!mit_manager!post_merge_error_detected(error_type=:broken_cable, error_description="Unterbrochener Trassenverlauf des Kabelstücks.", cleanup_description="Korrigieren Sie bitte das Kabelstück.")
[09.01.2008 22:33:45] [info] [pta_merge_alternatives.pta_merge_alternatives:int!merge_view()] Datenbank gis - Alternative "|Engineering Design|PLAN_42392" - Projekt/Planung "NVM_521007 - Engstringerstr. 29, Abb. mit Wiederaufbau": Merge durchgeführt.
1199914425:337	design_clerk using_alternative: {dc!21994}
[09.01.2008 22:33:51] [info] [pta_merge_alternatives.pta_merge_alternatives:int!merge_view()] Datenbank gis - Alternative "|Engineering Design|PLAN_42420" - Projekt/Planung "NVM_519547 - Bennwil,Eichholzstr.1+4,Abbr.F": Merge durchgeführt.
1199914431:306	design_clerk using_alternative: {dc!21996}

 

 

in diesem ausschnitt könnt ihr sehen was ich meine. Er schreibt da ja was von broken_cable und als nächste kommt dann die PLAN_42392

 

Da ich dieses beispiel schonmal hier habe muss es auch für den Fehler klappen der nicht die PLAN_..... direkt drunter stehen hat. wie hier "broken_conduit" da kommt der andere Fehler noch drunter

 

das script sollte dann in logile so aussehen:

mit!mit_manager!post_merge_error_detected(error_type=:broken_conduit, error_description="Unterbrochener Trassenverlauf des Rohres.", cleanup_description="Korrigieren Sie bitte das Rohr.")

[09.01.2008 22:33:51] [info] [pta_merge_alternatives.pta_merge_alternatives:int!merge_view()] Datenbank gis - Alternative "|Engineering Design|PLAN_42420" - Projekt/Planung "NVM_519547 - Bennwil,Eichholzstr.1+4,Abbr.F": Merge durchgeführt.

 

 

Wäre super wenn einer von euch vielleicht eine Lösung via batch oder vbs hätte. Werde noch weiter versuchen es selber hinzubekommen

Link zu diesem Kommentar

Hallo,

 

Bin nicht so erfahren was das scripten mit batch oder vbs betrifft
da hast du eine schöne Aufgabe, um hineinzukommen

Ich kann dir gerne das m.E. notwendige Werkzeug in vbs dazu geben:

 

Microsoft Windows 2000 Scripting Guide - Searching for Text in a String

Microsoft Windows 2000 Scripting Guide - Making Decisions

Microsoft Windows 2000 Scripting Guide - Reading and Writing Text Files

Microsoft Windows 2000 Scripting Guide - Arrays

 

-du liest das Logfile zeilenweise in ein Array ein

-du suchst im Text ob in einer Zeile ein Treffer vorkommt. Falls ja, gibst du das Arrayelement dieser Zeile + das nächste Arrayelement in die Ausgabe

 

 

Eine fertige Lösung habe ich keine parat

 

cu

blub

Link zu diesem Kommentar

Hallo Blub,

 

also habe soweit jetzt alles geschafft was ich wolte. Jetzt habe ich nur ein Problem.

Wenn er nach dem Fehler sucht findet er in auch und schreibt diesen in eine text datei.

 

Wenn er den fehler gefunden hat sucht er anschliessend nach einem bestimmten string "Engenee..." aber diesen schreibt er nicht einmal sondern 2 mal in die datei. Weiß aber leider nicht warum.

 

hast du eine Idee wieso. Habe das script und den logfile mal angehangen.

 

hier auch mal da script

 

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8

myName = WScript.ScriptFullName
myPath = Left(myName, InStrRev(myName, "\"))

strLogFile = mypath & "\" & "fo.txt"  'mypath


Function RegExpTest(patrn, strng)
RegExpTest = False
  Dim regEx, Match, Matches   ' Create variable.

  Set regEx = New RegExp   ' Create a regular expression.

  regEx.Pattern = patrn   ' Set pattern.

  regEx.IgnoreCase = True   ' Set case insensitivity.

  regEx.Global = True   ' Set global applicability.

  Set Matches = regEx.Execute(strng)   ' Execute search.

  For Each Match in Matches   ' Iterate Matches collection.

		Wscript.Echo strng
	Call WriteToLog(strLogFile, strng)

	RegExpTest = True


  Next

End Function

Sub WriteToLog(inFile, inText)

Set objFile1 = objFSO.OpenTextFile(inFile, 8, True)
objFile1.WriteLine(inText)
objFile1.Close

End Sub

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(mypath & "\" & "session.txt", 1)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
 patrn = "broken_conduit"
 	If RegExpTest (patrn, strLine) Then
  		Do Until RegExpTest ("Engineering Design|PLAN_", strLine)
  		   			strLine = objFile.ReadLine
  		Loop
 	End If
Loop
objFile.Close


'generadet by Chris.M an Vladi. P.

test.vbs.txt

objekte.txt

Link zu diesem Kommentar

Hallo Chris,

Ich habe jetzt nur die Symptome bereinigt, indem ich eine Boolvariable bprint eingeführt habe.

 

bprint=0	
  For Each Match in Matches   ' Iterate Matches collection.

	if bprint=0 then
	Wscript.Echo strng , boprint
	Call WriteToLog(strLogFile, strng)
	bprint=1
	end if
	RegExpTest = True


  Next

 

Irgendwie baut er den String in der Variablen matches 2*mal zusammen.

 

cu

blub

Link zu diesem Kommentar

Hi Blub,

 

habe es jetzt mal so eingefügt und muss sagen es funktioniert wunderbar.

 

habe aber jetzt ein anderes Problem.

Wie beim anfang beschrieben muss ich ihn nach mehreren Fehlern suchen lassen. Das mit dem Arry krieg ich irgendwie nicht hin.

 

habe es auch mal im string "patrn" versucht mit oder also "|" aber irgendwie spuckt er mir nur eins aus (Beisp. patrn = "broken_cable|broken_conduit")

 

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8

myName = WScript.ScriptFullName
myPath = Left(myName, InStrRev(myName, "\"))

strLogFile = mypath & "\" & "fehlerobjekte.txt"  'mypath


Function RegExpTest(patrn, strng)
RegExpTest = False
  Dim regEx, Match, Matches   ' Create variable.

  Set regEx = New RegExp   ' Create a regular expression.

  regEx.Pattern = patrn   ' Set pattern.

  regEx.IgnoreCase = True   ' Set case insensitivity.

  regEx.Global = True   ' Set global applicability.

  Set Matches = regEx.Execute(strng)   ' Execute search.

bprint=0
  For Each Match in Matches   ' Iterate Matches collection.

	if bprint=0 then
	Wscript.Echo strng , boprint
	Call WriteToLog(strLogFile, strng)
	bprint=1
	end if
	RegExpTest = True


  Next

End Function

Sub WriteToLog(inFile, inText)

Set objFile1 = objFSO.OpenTextFile(inFile, 8, True)
objFile1.WriteLine(inText)
objFile1.Close

End Sub

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(mypath & "\" & "session.txt", 1)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
 patrn = "broken_cable"
  	If RegExpTest (patrn, strLine) Then
  		Do Until RegExpTest ("Engineering Design|PLAN_", strLine)
  		   			strLine = objFile.ReadLine
  		Loop
 	End If
Loop
objFile.Close

 

 

weißt du vielleicht wie ich das am besten mache das er nach mehreren sucht

 

broken_cable ; broken_conduit und noch weitere.

 

Gruss und Dank

Chris

Link zu diesem Kommentar

hi,

mit der Powershell gehts dann doch schneller:

 

 

folgende Datei als *.ps1 abspeichern

-----------

$a=get-content .\fehlerobjekte.txt
for ($i = 0; $i -le ($a.length - 1); $i ++) {
if ($a[$i] -match "broken_cable|Plan_123"){
$a[$i]
$a[$i+1]
$i=$i+1
}
}

-----------

 

 

Running Windows PowerShell Scripts

 

in der Powershell in das ps1-Verzeichnis wechseln und mit .\<scriptname>.ps1 aufrufen

 

wenn du mehr Hilfe für die Suchkriterien brauchst, gib einfach

get-help about_regular_expression

in der ps-Konsole ein

 

cu

blub

Link zu diesem Kommentar
  • 5 Wochen später...
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...