Power Query - zeige letzte N Zeilen über aktueller Zeile an

micha

Erfahrenes Mitglied
Liebe Community,


ich habe eine Protokolldatei mit Tausenden von Textzeilen, die als Debug von einem Programm gesendet werden und jeden Schritt auflistet, der ausgeführt wurde.

Um das Programm zu optimieren, analysiere ich das Protokoll mit Hilfe von Power Query und zähle die Anzahl der Zeilen mit einem bestimmten Inhalt (z. B. "06:56:12 - Start von Aktivität A" oder eine andere Zeile "07:51:12 - Ende fehlgeschlagen"), um die Anzahl der Vorkommnisse für jedes Ereignis zu ermitteln.

Eines dieser Ereignisse "Ende fehlgeschlagen" hat eine zusätzliche Anforderung, die ich mit der Power Query noch nicht erfüllen kann:

- Das Ereignis "Ende fehlgeschlagen" kommt in der Protokolldatei mehrfach vor,

- Um den Grund für "Ende fehlgeschlagen" zu analysieren, muss ich die letzten 20 Zeilen oberhalb des Ereignisses überprüfen



Mein bisheriger Ansatz: Ich habe zwei neue Spalten erstellt:

- eine Bedingungsspalte, die prüft, ob die ursprüngliche Spalte den Wortlaut "Ende fehlgeschlagen" enthält. Wenn die Bedingung erfüllt ist, gebe ich "ja" aus, sonst "nein".

- eine Indexspalte, die es mir ermöglicht, nach der Filterung der vorherigen bedingten Spalte auf "ja" jede Zeile zu identifizieren, die den Inhalt "Ende fehlgeschlagen" hat.

Meine Idee war, diese Tabelle für den nächsten Schritt zu verwenden:

- Für jede Zeile in dieser Tabelle möchte ich die Zeilen index-1 bis index-20 oberhalb der entsprechenden Indexzeile hinzufügen.

Eine Sortierung nach Index würde mir dann die Abfolge der Ereignisse in der Protokolldatei liefern, allerdings nur gefiltert nach "Ende fehlgeschlagen" und den entsprechenden 20 Zeilen darüber.

- Mit dieser Ausgabe kann ich dann die gesamte Spalte in einer Pivot-Tabelle analysieren, welche Ereignisse wie oft vor "Ende fehlgeschlagen" in der gesamten Protokolldatei aufgetreten sind.

Wie würdet Ihr die Situation angehen?

Vielen Dank für die Hilfe!
 
Wie würdet Ihr die Situation angehen?
Ehrlichgesagt: Ich würde mir für sowas einfach schnell ein kleines Skript zusammenbasteln. Würde das nicht mit Office machen.
Da du (wahrscheinlich) auf Windows bist, hast du wohl keine Bourne-Shell (sh). Dann würde ich mir schnell etwas in Python zusammenskripten (ungetestet):
Python:
import sys

with open(sys.argv[1], 'r') as ifile:
    lines = ifile.readlines()

for i, l in enumerate(lines):
    if 'Ende' in l and 'fehlgeschlagen' in l:
        i_begin = max(i - 20, 0)
        print('\n'.join(lines[i_begin:i+1]))

Das ganze in eine Skriptdatei speichern, z.B. dump_stacktraces.py. Dann ziehst du die Skriptdatei in den gleichen Ordner, wo auch deine Stacktraces liegen. Shift+Rechtsklick in den Ordner → Eingabeaufforderung/Powershell öffnen → "python dump_stacktraces.py protokolldatei1.txt" eintippen.
Das setzt natürlich voraus, dass du Python auf deinem System installiert hast.

Wie gesagt: Ich würd's so machen.

Gruß Technipion
 
Und falls du doch mit PoerQuery arbeiten willst.
Ich habe hier eine Testtabelle mit dem Feld DESC. Darin sind mehrfach die Buchstaben a bis h. Darin suche ich "g" und die 3 vorhergehenden Zeilen.
1643027165282.png

Das Powerquery
Code:
let
    //Anzahl Zeilen definieren, die masgebend sind.
    backLines = 3,
    //Tabelle aus Worksheet auslesen
    tbl = Excel.CurrentWorkbook(){[Name="MY_DATA"]}[Content],
    //Index SPalte anfügen
    addIndex = Table.AddIndexColumn(tbl, "index", 1, 1, Int64.Type),
    //Die Zeilen mit DESC beginnnt mit "g" finden
    searchRows = Table.SelectRows(addIndex, each Text.StartsWith([DESC], "g")),
    //Die zwei Quellen addIndex und searchRows miteinander mit einem Between verbinden
    result = Table.ExpandTableColumn(
        Table.AddColumn(
            addIndex, "idx_1",
            each let i=[index] in Table.SelectRows(searchRows, each [index] -backLines <= i and [index] >= i)
        ),
        "idx_1", {"index", "DESC"}, {"master_index", "master_desc"})
in
    result

Ergit das Resultat
1643027188178.png
Damit kann man weiter arbeiten
 

Anhänge

  • 1643026551546.png
    1643026551546.png
    7 KB · Aufrufe: 2
  • 1643026790385.png
    1643026790385.png
    22,3 KB · Aufrufe: 2
Zuletzt bearbeitet:
Zurück