用空格分隔的15列加载日志,但最后一列包含空格

时间:2013-04-29 16:14:52

标签: r shell logging csv read.table

我有一个日志文件,其中15列用空格分隔,但日志文件中的最后一列是电子邮件主题行并包含空格。我不知道如何将这样的文件读入R. 最后一列看起来像:SUBJ:X XXX XXX XXX XXX XXX 我知道如何使用read.table读取空格分隔文件,但我不知道该怎么做,给出最后一列。

2 个答案:

答案 0 :(得分:1)

如果最后一列始终以“SUBJ”开头,您可以使用类似的东西。

对于这个例子,我们将组成一个名为“myFile”的示例文件:

cat("aaaa bbb ccccc SUBJ:X Y ZZZ\naaaaaa bbbbbbb ccccccc SUBJ:X XXX\naaa b ccccc\n", file = "myFile.txt")

使用readLines读入myFile.txt(或您的实际日志文件)。请注意,第三行没有主题。

myFile <- readLines("myFile.txt")
myFile
# [1] "aaaa bbb ccccc SUBJ:X Y ZZZ"      
# [2] "aaaaaa bbbbbbb ccccccc SUBJ:X XXX"
# [3] "aaa b ccccc"  

使用一些正则表达式匹配最后一个“列”:

myMatches <- gregexpr("SUBJ:.*$", myFile)

使用该信息阅读data.frame

cbind(read.table(text = unlist(regmatches(myFile, myMatches, invert=TRUE))), 
      subj = sapply(regmatches(myFile, myMatches), 
                    function(x) ifelse(length(x) > 0, x, NA)))
#       V1      V2      V3         subj
# 1   aaaa     bbb   ccccc SUBJ:X Y ZZZ
# 2 aaaaaa bbbbbbb ccccccc   SUBJ:X XXX
# 3    aaa       b   ccccc         <NA>

答案 1 :(得分:0)

使用readLines读取它,然后使用gsub替换前14个空格的逗号。

这显示了如何使用一个简单的例子来做到这一点:

  gsub("^(\\w\\s)(\\w\\s)(\\w\\s)(\\w\\s)", "\\1,\\2,\\3,\\4," , 
                                 paste(letters[1:8], collapse=" ") )
  [1] "a ,b ,c ,d ,e f g h"