【问题标题】:Load Log With 15 Columns Separated By Spaces But Last Column Contains Spaces加载 15 列用空格分隔但最后一列包含空格的日志
【发布时间】:2013-04-23 09:34:57
【问题描述】:

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

【问题讨论】:

  • 日志文件是否是固定宽度?
  • 不,它包含电子邮件信息。宽度各不相同。

标签: r shell logging csv read.table


【解决方案1】:

使用 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"

【讨论】:

    【解决方案2】:

    如果最后一列总是以“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>
    

    【讨论】:

    • 这似乎是一个很好的解决方案,但是有些电子邮件没有主题行并且返回错误。
    • @user1507889,当没有主题时,“SUBJ”一词是否仍然显示在行中?
    • 是的,没有 SUBJ。只是空白。
    • @user1507889,试试我的更新,看看它是否适用于这些情况。
    • 啊。这解决了这个问题。谢谢您的帮助。我在尝试加载表时遇到“扫描错误(文件,什么,nmax,sep,dec,quote,skip,nlines,na.strings,:第 7 行没有 16 个元素”。似乎一些没有主题行的行的列数少于其他行。第 7 行有 15 个元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多