我想构建一个数据框,例如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常见日志格式做的...但是这个所有向量都是相同的长度。这是由空间隔开的消息,这些消息在这里杀了我。数据框甚至是正确的方法吗?
### 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 :(得分: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
会将这些缺失的值转换为NA
。 stringsAsFactors
用于处理普通字符串。
data_dt <- read.table("log.txt", sep = " ", header = FALSE,
fill = TRUE, stringsAsFactors = FALSE, na.strings = "")
要重建最后一列,您可以apply
将paste
函数添加到每一行。
V9 <- apply(data_dt[,9:ncol(data_dt)], MARGIN=1, FUN=function(v) paste(na.omit(v), collapse=" "))
然后,您可以将前8列与第9次重建
组合(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
可以更好地实现这样的事情,但我不知道如何。希望这对你来说是一个好的开始。