2017-08-20 5 views
1

Ich habe eine LOG-Datei, die ein inkonsistentes Datenformat hat.Arbeiten mit Protokolldateien in R

Die Daten sieht wie folgt aus etwas und ist als "Little-Endian UTF-16 Unicode" Text gespeichert:

2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 
    [XYZ 1000 T1]:1 
2017-06-22 01:15:17.945 NOTHING 'D': 989 
    [CASE] IN: [ID: 1010]33 
    [CASE] IN: [ID: 2010]8 
2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 
2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 
2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 

323133.....238813 76378 989899 000000000000 

Nun, ich mehrere Log-Dateien, die diese Art von Muster folgen. Ich habe versucht, scan() und read.table(), beide liefern keine Daten zurück in dem Format, das ich erwarte es zu tun.

Das Datenformat ich erwarte sieht wie folgt aus:

Date       String 
2017-06-21 00:00:30.483  START THIS THING 

Aber ich diese Zeile mehrere Male in den Log-Dateien haben:

[CASE] IN: [ID: 1010]33 
[CASE] IN: [ID: 2010]8 

Und das

323133.....238813 76378 989899 000000000000 

Was wäre der beste Weg, um diese Lösung zu erreichen? Vielen Dank!

Antwort

1

Nur eine rohe Skizze (ohne Berücksichtigung der Zeit Teil Ihrer Zeitstempel und Spaltennamen) Basis R mit ohne Performance-Optimierung (wie data.table::fread verwenden und das Paket lubridate):

log.data <- "2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 
    [XYZ 1000 T1]:1 
2017-06-22 01:15:17.945 NOTHING 'D': 989 
    [CASE] IN: [ID: 1010]33 
    [CASE] IN: [ID: 2010]8 
2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 
2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 
2017-06-21 00:00:30.483 START THIS THING 
2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 

323133.....238813 76378 989899 000000000000" 

log <- read.csv(text = log.data, sep = "\n", header = F) 
log$timestamp <- as.Date(log[,1]) 

Daraus ergibt sich:

> log 
               V1 timestamp 
1 2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 2017-06-21 
2         [XYZ 1000 T1]:1  <NA> 
3   2017-06-22 01:15:17.945 NOTHING 'D': 989 2017-06-22 
4       [CASE] IN: [ID: 1010]33  <NA> 
5       [CASE] IN: [ID: 2010]8  <NA> 
6   2017-06-21 00:00:30.483 START THIS THING 2017-06-21 
7 2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 2017-06-21 
8   2017-06-21 00:00:30.483 START THIS THING 2017-06-21 
9 2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 2017-06-21 
10   2017-06-21 00:00:30.483 START THIS THING 2017-06-21 
11 2017-06-21 00:00:56.400 SOMETHING ELSE HAPPENS 2017-06-21 
12 323133.....238813 76378 989899 000000000000  <NA> 

Update 1:

Da fand man heraus, Damit Ihre Protokolldatei die UTF-16-Kodierung der Little-Endian-Datei verwendet (überprüft mit dem Befehl file von Linux/OSX in einem Terminal), müssen Sie die Dateicodierung zu read.csv hinzufügen, damit R den Dateiinhalt beim Lesen korrekt konvertiert:

log <- read.csv(file = "my.log", sep = "\n", header = F, fileEncoding = "UTF-16LE", encoding = "UTF-8") 
+0

Danke für die Hilfe. Aber die Dateien, die ich habe, haben die Erweiterung .log. Ich bekomme Fehler wie: "Zeile 1 scheint eingebettete Nullen zu enthalten". Außerdem liest es nur ein Element, und nichts anderes erscheint, wenn ich read.csv mit .log-Datei verwendete. –

+0

Doe die .log-Dateien enthalten Text oder ein binäres Format? Falls es sich um einen Textinhalt handelt: Verwenden Sie 'read.csv (file =" mein.log ", sep =" \ n ", header = F)' oder zeigen Sie uns Ihren R-Code an, der fehlschlägt. –

+0

Wie überprüfe ich das? –