Ich versuche, eine Menge dieser Art von Dateien mit R zu lesen, um die Informationen auszuwerten und die Daten in ein Datenrahmen-ähnliches Format zu bringen:
Dies ist der Inhalt der Datei:
%Vor%Ich muss "Jul 4 2016 7:21 AM" als Datum erfassen, aus der Zeile "Engine Utilization (Tick%)", Server Summary - & gt; Average "4.2%"
Aus dem Abschnitt "Transaktionsprofil" - & gt; Transaktionsprofil "count" -Eintrag.
Also sollte mein Datenrahmen ungefähr so aussehen:
%Vor%Kann mir jemand helfen, diese Datei zu parsen, um diese Ausgabe zu erhalten?
Ich habe so etwas versucht:
%Vor%um diese Zeile zu erhalten:
%Vor%Aber ich möchte in der Lage sein, nur nach
Durchschnitt zu extrahierenEngine Utilization (Tick%), da viele Zeilen mit Average beginnen können. Die Durchschnittslinie, die direkt nach der Verwendung der Engine (Tick%) angezeigt wird, ist diejenige, die ich möchte.
Wie lege ich das in diese Zeile, um diese Information aus dieser Datei zu extrahieren:
%Vor%Kann ich grep in dieser Zeile lesen, um nach bestimmten Zeichen zu suchen?
%%%% Shot 1 - hat etwas funktioniert
%Vor%%%% Shot 2: Erster Versuch, eine (möglicherweise variable) Anzahl von Geräte-Spalten zu extrahieren
%Vor%%%%%%%%%% Shot 3: extrahiere zwei Tabellen, eine mit einer einzelnen Zeile und eine zweite mit einer variablen Anzahl von Zeilen (abhängig davon, welche Geräte in jeder sysmon-Datei aufgelistet sind).
%Vor% Das Manipulieren von Textdateien kann manchmal mit dedizierten Programmen einfacher sein. Z.B. gawk
wurde speziell zum Suchen von Mustern in Textdateien und zum Ausgeben von Daten daraus entwickelt. Wir können ein kurzes Gawk-Skript verwenden, um die benötigten Daten in R zu laden. Beachten Sie, dass jede Zeile des Skripts aus einem Muster besteht, nach dem gesucht werden soll, gefolgt von einer Aktion in {}
. NR
ist ein Zähler, der die Anzahl der bisher gelesenen Zeilen zählt.
Speichern Sie dieses Skript mit dem Namen "ext.awk" und extrahieren Sie dann alle Datendateien in einen R-Datenrahmen (vorausgesetzt, sie befinden sich alle in einem Ordner und haben die Erweiterung .txt
) mit
NB, gawk ist in den meisten Linux-Versionen bereits installiert. Unter Windows müssen Sie es möglicherweise von http://gnuwin32.sourceforge.net/packages/gawk.htm
Zum Lesen der Dateien Hier nehme ich CSV als Dateityp an. Für andere besuchen Sie bitte Ссылка
%Vor%== & gt; merge akzeptiert nur zwei Argumente
%Vor%Jetzt haben Sie alle Spalten im Datenrahmen
%Vor%Sie können alle Spalten im Datenrahmen sehen
Extrahieren Sie die Spalten wie gewünscht == & gt; Die Funktion subset () ist der einfachste Weg, Variablen und Beobachtungen auszuwählen
%Vor%Jetzt können Sie es in CSV oder einen beliebigen Dateityp schreiben
%Vor%Zum Zusammenführen aller Dateien
%Vor%Nachdem Sie den Code zum Definieren der Funktion ausgeführt haben, können Sie ihn verwenden. Die Funktion nimmt einen Pfad. Dieser Pfad sollte der Name eines Ordners sein, der alle Dateien enthält, die Sie zusammen lesen und zusammenführen möchten, und nur die Dateien, die Sie zusammenführen möchten. In diesem Sinne habe ich zwei Tipps:
Bevor Sie diese Funktion verwenden, ist es mein Vorschlag, einen neuen Ordner in einem kurzen Verzeichnis anzulegen (zum Beispiel könnte der Pfad für diesen Ordner "C: // R // mergeme" lauten) und alle Ihre Dateien speichern möchte in diesem Ordner zusammenführen. Stellen Sie außerdem sicher, dass die Spalte, die den Abgleich durchführt, auf die gleiche Weise (und mit demselben Namen) in jeder der Dateien formatiert ist. Angenommen, Sie haben Ihre 20 Dateien im Mergeme-Ordner unter "C: // R // mergeme" gespeichert und möchten sie lesen und zusammenführen. Um meine Funktion zu verwenden, verwenden Sie die folgende Syntax:
%Vor%Nachdem Sie diesen Befehl ausgeführt haben, verfügen Sie über einen vollständig zusammengesetzten Datenrahmen, bei dem alle Ihre Variablen aufeinander abgestimmt sind
Jetzt können Sie den Datenrahmen gemäß den erforderlichen Spalten unterteilen.
Verwenden Sie readLines
oder stringi::stri_read_lines
, um den Inhalt der Datei als Zeichenvektor zu lesen. Letzteres ist typischerweise schneller, aber nicht so ausgereift und bricht gelegentlich mit ungewöhnlichem Inhalt.
Für schnelles reguläres Expression-Matching ist stringi
normalerweise die beste Wahl. Mit rebus.datetimes
können Sie einen regulären Ausdruck aus einer strptime
Datumsformat-Zeichenfolge generieren.
Die Zeile, in der current_run
erscheint, wird gefunden mit:
Um die Daten zu extrahieren, schaut dieser Code nur auf die zweite Zeile nach der Zeile, in der der aktuelle Lauf gefunden wurde, aber der Code ist vektorisierbar, so dass Sie alle Zeilen leicht betrachten können, wenn Sie Dateien haben, für die diese Annahme nicht gilt halten.
%Vor%Der Abschnitt "Engine Utilization" wird über
gefunden %Vor%Wir wollen die erste Instanz von "Server Summary", die hinter dieser Zeile steht.
%Vor%Verwenden Sie einen regulären Ausdruck, um die Zahl aus der nächsten Zeile zu extrahieren.
%Vor%Die Zeile "Committed Xacts" ist
%Vor%Der Zählwert besteht aus einer Reihe von Ziffern, die vom Leerzeichen umgeben sind.
%Vor%