2015-12-18 36 views
-2

我想用例如9列構建數據框,並將日誌文件用作我的輸入。對於前8列,我知道文件被空格整齊分隔。但是第9列是一個由單詞和變量組成的消息,也是由空格分隔的。用不同長度的句子構建數據框

V1 V2  V3  V4  V5  V6  V7 V8    V9 

1a lo_Out [12/4/15 12:36:01:367 GMT] 000000be con J This is a message N characters long 
1a lo_In [12/4/15 12:36:01:403 GMT] 0000008c Com W This is a message N characters long 
2a lo_Out [12/4/15 12:36:01:404 GMT] 0000008c con J This is a message N characters long 
2a lo_In [12/4/15 12:36:01:404 GMT] 000000be Com X This is a message N characters long 

所以,我可以在文件中讀取,並停止我的代碼試圖分開的最後一列,只是傾倒剩菜到最後一列?

這是我做了類似的Apache日誌通用格式......但所有這一切的載體分別是相同的長度。這是由空間隔開的消息,在這裏殺死我。 Data Frame甚至是正確的方式嗎?

### First read in the logfile 
logfile <- 'logfile.net-Nov-2015'; 


data_dt <- fread(logfile, sep = ' '); 

### Load and rename important columns 
data_dt[, ip_address := as.character(V1)]; 
data_dt[, timestamp := paste(V4, V5)]; 
data_dt[, request  := V6]; 
data_dt[, http_status := V7]; 
data_dt[, return_size := V8]; 
data_dt[, referer  := V9]; 
data_dt[, user_agent := V10]; 
+0

如果編輯輸入數據,我們很難給你一個準確的答案 – Emer

+0

道歉,當我看到你的答案,我意識到,我的數據是不準確的。我的壞 – Harunhh123

+1

我更新使用新的方案 – Emer

回答

2

嘗試使用quote選項read.table

data_dt <- read.table(logfile, sep = " ", quote = "\"", header = FALSE) 

欲瞭解更多詳情,請閱讀文檔:read.table

編輯:

如果你沒有被引用的字符串,你可以嘗試重建第九列如下。

首先,讓我們使用一些可重複的數據來進行測試,可以存儲在一個名爲「log.txt的」文件。單個字母代表你的話。

logfile_content <- "aaa bbb ccc ddd eee fff ggg hhh i j k 
aaa bbb ccc ddd eee fff ggg hhh l m 
aaa bbb ccc ddd eee fff ggg hhh 
aaa bbb ccc ddd eee fff ggg hhh n o p q r s t 
aaa bbb ccc ddd eee fff ggg hhh u 
" 
write(logfile_content, "log.txt") 

閱讀帶有額外參數的文件。 fill將爲列數小於最大值的行生成缺失值。 na.strings會將這些缺失值轉換爲NAstringsAsFactors用於處理普通字符串。

data_dt <- read.table("log.txt", sep = " ", header = FALSE, 
         fill = TRUE, stringsAsFactors = FALSE, na.strings = "") 

爲了重構最後一欄,你可以applypaste功能每一行。

V9 <- apply(data_dt[,9:ncol(data_dt)], MARGIN=1, FUN=function(v) paste(na.omit(v), collapse=" ")) 

然後你就可以與第九結合你的第一個8列重建

(data_dt2 <- cbind(data_dt[,1:8], V9)) 
    V1 V2 V3 V4 V5 V6 V7 V8   V9 
1 aaa bbb ccc ddd eee fff ggg hhh   i j k 
2 aaa bbb ccc ddd eee fff ggg hhh   l m 
3 aaa bbb ccc ddd eee fff ggg hhh    
4 aaa bbb ccc ddd eee fff ggg hhh n o p q r s t 
5 aaa bbb ccc ddd eee fff ggg hhh    u 

請注意,如果你的日誌文件是巨大的,這可能不是表現非常好。我相當確定這樣的事情可以用data.table更好地實現,但我不知道如何。希望這對你來說是一個好的開始。

+0

這是一個巨大的日誌文件,但這是一個很好的開始,我稍後會擔心性能。謝謝 – Harunhh123

+1

在這種情況下,我建議你使用Apache Spark – Emer