2016-07-30 3 views
0

Ich versuche, eine Protokolldatei der NASA-Daten Zeile für Zeile zu lesen und dann in 5 Spalten aufzuteilen. Aber im Moment scheint es nicht richtig zu splitten, und ein anderes Problem ist, dass es keine gemeinsamen Splilting-Zeichen gibt.Nicht sicher, wie Zeichenfolge richtig aufgeteilt und mit Variablen in R ausgegeben

fileName <- 'C:/Users/xxxxx/Desktop/access_log_Jul95.txt'   
fileConn<-file('C:/Users/xxxxx/Desktop/output.txt')     
conn <- file(fileName,open="r") 
linn <-readLines(conn) 
fo00:00:12 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 0 

Dies ist die Ausgabe Ich möchte:

199.72.81.55, [01/Jul/1995:00:00:01 -0400], GET, /history/apollo/ HTTP/1.0, 200, 6245 
+0

Bitte teilen Sie ein paar (oder alle) Zeilen der Eingabedatei. Ohne die Startdatei haben wir keine Ahnung, was schief gelaufen ist. – Abdou

+0

@abdou Entschuldigung, ich habe es falsch eingegeben, sollte es eingegeben werden –

+0

Wie würde der gewünschte Ausgangsdatenrahmen im obigen Beispiel aussehen? – thepule

Antwort

1

Versuchen Sie diesen regulären Ausdruck (- - |(?<=]) |(?<=\\") |(?<=\\d) (?=\\d)) für Split:

lines <- readLines(conn) 
do.call(rbind, 
    lapply(lines, function(line) strsplit(line, '(- - |(?<=]) |(?<=\\") |(?<=\\d) (?=\\d))', perl = T)[[1]])) 

#  [,1]     [,2]       [,3]                [,4] [,5] 
# [1,] "199.72.81.55"   "[01/Jul/1995:00:00:01 -0400]" "\"GET /history/apollo/ HTTP/1.0\""        "200" "6245" 
# [2,] "unicomp6.unicomp.net" "[01/Jul/1995:00:00:06 -0400]" "\"GET /shuttle/countdown/ HTTP/1.0\""        "200" "3985" 
# [3,] "199.120.110.21"  "[01/Jul/1995:00:00:09 -0400]" "\"GET /shuttle/missions/sts-73/mission-sts-73.html HTTP/1.0\"" "200" "4085" 
# [4,] "burger.letters.com" "[01/Jul/1995:00:00:11 -0400]" "\"GET /shuttle/countdown/liftoff.html HTTP/1.0\""     "304" "0" 
# [5,] "199.120.110.21"  "[01/Jul/1995:00:00:11 -0400]" "\"GET /shuttle/missions/sts-73/sts-73-patch-small.gif HTTP/1.0\"" "200" "4179" 
# [6,] "burger.letters.com" "[01/Jul/1995:00:00:12 -0400]" "\"GET /images/NASA-logosmall.gif HTTP/1.0\""      "304" "0" 
# [7,] "burger.letters.com" "[01/Jul/1995:00:00:12 -0400]" "\"GET /shuttle/countdown/video/livevideo.gif HTTP/1.0\""   "200" "0" 
2

nicht so elegant wie @Psidom Lösung, aber das macht den Job:

library(stringr) 
library(dplyr) 

    df <- str_split(linn, " ") %>% 
     do.call(rbind, .) %>% 
     as.data.frame() %>% 
     mutate(V6 = str_replace(df$V6, '"', ""), 
       V8 = str_replace(df$V8, '"', ""), 
       a = paste(V4, V5), 
       b = paste0(V7, V8)) %>% 
     select(c(1, 11, 6, 12, 9, 10)) 
# Clean up the column names 
names(df) <- paste0("V", seq_along(1:ncol(df))) 

Ausgabe:

    V1       V2 V3              V4 V5 V6 
1   199.72.81.55 [01/Jul/1995:00:00:01 -0400] GET        /history/apollo/HTTP/1.0 200 6245 
2 unicomp6.unicomp.net [01/Jul/1995:00:00:06 -0400] GET        /shuttle/countdown/HTTP/1.0 200 3985 
3  199.120.110.21 [01/Jul/1995:00:00:09 -0400] GET /shuttle/missions/sts-73/mission-sts-73.htmlHTTP/1.0 200 4085 
4 burger.letters.com [01/Jul/1995:00:00:11 -0400] GET     /shuttle/countdown/liftoff.htmlHTTP/1.0 304 0 
5  199.120.110.21 [01/Jul/1995:00:00:11 -0400] GET /shuttle/missions/sts-73/sts-73-patch-small.gifHTTP/1.0 200 4179 
6 burger.letters.com [01/Jul/1995:00:00:12 -0400] GET      /images/NASA-logosmall.gifHTTP/1.0 304 0 
7 burger.letters.com [01/Jul/1995:00:00:12 -0400] GET   /shuttle/countdown/video/livevideo.gifHTTP/1.0 200 0 
+1

Gute Option. Plus eins. – akrun

Verwandte Themen