Jump to content

Helmer

Members
  • Gesamte Inhalte

    7
  • Registriert seit

  • Letzter Besuch

Letzte Besucher des Profils

Der "Letzte Profil-Besucher"-Block ist deaktiviert und wird anderen Benutzern nicht angezeit.

Fortschritt von Helmer

Apprentice

Apprentice (3/14)

  • Einen Monat dabei
  • Eine Woche dabei
  • Passioniert Rare
  • Erste Antwort
  • Erster eigener Beitrag

Neueste Abzeichen

1

Reputation in der Community

  1. Durch die massive Unterstützung von euch, schaut nun eine Lösung so aus: $SampleData = "c:\temp\Schnittstelle\oru.log" $Reader = [IO.StreamReader]::new( $SampleData ) $Results = [Collections.Arraylist]::new() $Queue = [Collections.Queue]::new() $BlockMarker = 'MSH' $MatchString = "7909265176" $MatchFound = $false While ( $SampleLine = $Reader.ReadLine() ) { $Queue.Enqueue( $SampleLine ) If ( $SampleLine -match $MatchString ) { $MatchFound = $true } If ( $SampleLine -match $BlockMarker ) { If ( $MatchFound ) { [void] $Results.Add(( $Queue.ToArray() )) $Zeilen = $Queue.Count for($i= 0; $i -lt $Zeilen -1 ; $i++) { $Queue.Dequeue() >> c:\temp\Schnittstelle\ORU_$(Get-Date -Format yyyy-MM-dd.hh.mm.ss).log } } $Queue.Clear() $MatchFound = $false $Queue.Enqueue( $SampleLine ) } } $Reader.Dispose() Es waren nur noch kleine Anpassungen zu dem fast fertigen Script von Martin nötig. In der Ausgabe ist immer die erste Zeile (MSH-Segment) der nächsten Nachricht mit ausgegeben worden. Ein Löschen des letzten Eintrags der $Queue ist mir nicht möglich gewesen, weshalb ich eine Schleife eingebaut habe, die die Queue (Einträge / Zeilen -1) ausgibt. Meinen herzlichen Dank an euch - Habt Ihr eine virtuelle Kaffeedose mit Schlitz für eine Spende? Helmer
  2. Danke dir / euch, ich würde mir das Ganze einmal durch die Hirnwindungen jagen und versuchen zu finalisieren. Danke für den Tipp mit dem "Contains" .... hat mich doch recht lange beschäftigt... Nur gut, dass auch andere sich mit / bei den Regex nicht zu Hause fühlen. .... ich schaue mal, wie weit ich komme.
  3. Danke für Eure Antworten. Es gilt, eine komplette Nachricht, welche einen Suchstring enthält, als Block zu exportieren. Die Struktur ist recht einfach. Eine Nachricht fängt immer mit dem MSH-Segment (am Zeilenanfang) an und endet mit dem nächsten MSH-Segment der nächsten Nachricht, innerhalb einer Archivdatei (es sind einige hundert Nachrichten pro Archivdatei). Das Lösen per Queue oder Array scheint mir Erfolg versprechend zu sein. Bei mir scheitert es an der korrekten Syntax für die Umsetzung (veranschaulicht am Stand in meinem letzten Post). Ich finde auch nicht wirklich viel beim großen „G“, in Verbindung mit Powershell und der Queue. Wie sich ein -split dazu hinreißen lässt, den Datenstrom bei einem gefundenen Suchstring zu unterbrechen und den entsprechenden Datensatz komplett (MSH > MSH) zu exportieren, finde ich spannend, da dieser Ansatz sehr „smart“ ausschaut. Z.B. der Suchstring „7909264350“ wird im PV1-Segment des Beispiels unten (Zitat) gefunden, nun sollte die komplette hervorgehobene Nachricht (von MSH > MSH) exportiert werden. Es ist durchaus möglich, dass der Suchstring mehrfach in der Archivdatei vorhanden ist (alle betreffenden Datensätze/Nachrichten komplett exportieren). Bisher wird dies manuell umgesetzt, Suchstring gefunden, ein paar Zeilen hoch (MSG-Segment vor dem Suchstring), markiert inklusive zur letzten Zeile der Nachricht (Zeile vor dem nächsten MSG-Segment), kopieren und in eine neue Datei einfügen.
  4. Hallo in die Runde, ich habe mich noch ein paar Stunden mit dem „Problem“ beschäftigt und wollte es „einfach“ machen. Die Beispieldatei von oben wird eingelesen und Zeilenweise in eine Queue geschrieben. Diese wird als erstes auf das Blockende hin untersucht, wenn dies gefunden, in einer zweiten if Schleife hin auf den Inhalt des Suchbegriffs. Wenn dieser gefunden, wird der Inhalt der Queue auf den Schirm ausgegeben. Da die Zeile nach dem Blockende immer der Start eines neuen Blocks ist, sollte auch immer nach dem „Blockende gefunden > Queue gelöscht“ ein neuer Block in der Queue angelegt werden. Ich mache es kurz, es geht nicht (siehe Ausgabe am Ende). Die Queue wird nicht nach den beiden Suchbegriffen durchsucht. Zudem wird die Queue nicht Zeilenweise um Einträge ergänzt. Es wird in der Queue dem ersten Eintrag direkt die nächste Zeile aus der Quelldatei angehängt und keine neue „Zeilen / Einträge“ in der Queue erzeugt. Beim zweiten "write-host $Queue;" findet keine Ausgabe eines kompletten Blocks statt. $Queue.Contains($SuchString) sucht nicht nach dem $SuchString irgendwo innerhalb der Queue? Die beiden Suchstrings „ORC“ und „PID“ sind nur beispielhaft ausgewählt < machen später keinen Sinn. $Queue = New-Object System.Collections.Queue $LogFile = "d:\powershell\hl7.log" $BlockEnde = "ORC" $SuchString = "PID" foreach ($i in Get-Content -Path $LogFile){ $Queue.Enqueue($i) write-host $Queue #Nur Kontrolle ob Queue sich füllt - Ausgabe siehe unten if ($Queue.Contains($BlockEnde)) { if ($Queue.Contains($SuchString)) { write-host $Queue #leider keine Ausgabe $Queue.Clear()} } pause #wieder eine Kontrolle wird Zeilenweise ausgeführt } kommt zu der Ausgabe: PS PS D:\Powershell> .\sort6.ps1 MSH|^~\&|MEL Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg OBR|2|WKC097U|WKC097U Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg OBR|2|WKC097U|WKC097U OBX|1|ST|BI-685^Staph Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg OBR|2|WKC097U|WKC097U OBX|1|ST|BI-685^Staph OBR|3|WKC097U|WKC097U Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg OBR|2|WKC097U|WKC097U OBX|1|ST|BI-685^Staph OBR|3|WKC097U|WKC097U OBX|1|ST|BI-PROT1^Bef Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg OBR|2|WKC097U|WKC097U OBX|1|ST|BI-685^Staph OBR|3|WKC097U|WKC097U OBX|1|ST|BI-PROT1^Bef NTE|1|L|Kulturelles W Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...: MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|S T|BI-032^Erreg OBR|2|WKC097U|WKC097U OBX|1|ST|BI-685^Staph OBR|3|WKC097U|WKC097U OBX|1|ST|BI-PROT1^Bef NTE|1|L|Kulturelles W MSH|^~\&| ME
  5. Die Ausgabe erzeugt eine schön in "Blöcke" formatierte Datei.... Lässt sich eine Überprüfung der einzelnen Blöcke einbauen, welche nur diese ausgibt, welche auch den Suchstring enthalten? ... ich gebe zu, dass ich sehr grün hinter den Ohren bin, was PS-Scripts angeht. Hier sehe ich nicht wirklich eine Umsetzungsmöglichkeit von deiner durchaus Sinnigen Beschreibung in Bezug auf das, was ich über lifo/fifo gefunden habe. Sorry da klickt es nicht bei mir....
  6. Sehr interessante Ideen, danke euch dafür. Ich hatte bisher die Geschichte so weit getrieben, dass er mir die MSH Abschnitte aus dem Logfile holt und auf dem Schirm ausgibt. Misslungen ist mir bisher das Testen der einzelnen Blöcke auf das Vorhandensein des Suchstrings und deren Ausgabe (Blöcke mit vorhandenem Suchstring) in eine Datei. Es ist halt auch nicht wirklich einfach, hinter die Regex Syntax zu steigen.... Get-Content .\oru.log | Out-String | % {[Regex]::Matches($_, "(?<=MSH(.*))((.|\n)*?)(?=MSH(.*))")} | % {$_.Value}
  7. Hallo zusammen, ich bin auf der Suche nach einer Möglichkeit innerhalb einer Textdatei nach einem Text zu suchen und den Textblock / Datensatz, welcher diesen enthält auszugeben. Der Anfang des Bereichs ist immer eine Zeile mit MSH am Anfang, beim nächsten MSH beginnt ein neuer Bereich (Logfiles einer medizinischen HL7-Schnittstelle < Beispiel unten stark gekürzt). Wenn innerhalb dieses Blocks der String "7909264350" gefunden wird, den entsprechenden gesamten Block ausgeben (im Beispiel fett markiert). MSH|^~\&|MEL PID|1||7903313686| PV1|1||^^^^^^^^2825||||||||||||||||7909260637| ORC|OK|WKC097U|WKC097U- OBR|1|WKC097U|WKC097U-1 OBX|1|ST|BI-032^Erreg OBR|2|WKC097U|WKC097U OBX|1|ST|BI-685^Staph OBR|3|WKC097U|WKC097U OBX|1|ST|BI-PROT1^Bef NTE|1|L|Kulturelles W MSH|^~\&|ME PID|1||7902183713| PV1|1||^^^^^^^^2938||||||||||||||||7909264350| ORC|OK|WKC058S|WKC OBR|1|WKC058S|WKC0 OBX|1|ST|BI-032^Er OBR|2|WKC058S|WKC0 OBX|1|ST|BI-603^Prot OBR|3|WKC058S|WKC058S OBX|1|ST|BI-PROT1^Bef NTE|1|L|Kulturelles Wach OBR|4|WKC058S|WKC058S-1| OBX|1|ST|BI-PROT2^Befund NTE|1|L|Antibiogramm sie OBR|5|WKC058S|WKC058S-1| OBX|1|ST|BI-ICD109^ICD10 NTE|1|L|A40-A41 Bakterie NTE|2|L|T82.7 Sepsis bei MSH|^~\&|ME PID|1||7903126877| PV1|1||^^^^^^^^2825||||||||||||||||7909265076| ORC|OK|WKC118D|WKC OBR|1|WKC118D|WKC1 OBX|1|ST|BI-032^Er OBR|2|WKC118D|WKC1 OBX|1|ST|BI-673^St OBR|3|WKC118D|WKC1 OBX|1|ST|BI-PROT1^ NTE|1|L|Zusätzlich OBR|4|WKC118D|WKC1 OBX|1|NM|BI-ATB^An OBR|5|WKC118D|WKC1 OBX|1|ST|BI-RES^Me NTE|1|L|Antibiogra NTE|2|L|Wirkstoff NTE|3|L|Penicillin NTE|4|L|Oxacillin NTE|5|L|Ampicillin Ideen? - Danke fürs Lesen Grüße Helmut
×
×
  • Neu erstellen...