如何继续阅读read.table忽略错误?

时间:2015-05-05 09:50:48

标签: r read.table

使用read.table()读取压缩格式的squid日志时,出现以下错误:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : line 134147 did not have 10 elements

解压缩文件,我看到第134147行已损坏。但是,还有其他行也同样已损坏,所以我不可能手动运行read.tables,查看有问题的行号,删除它,然后重复整个过程。

有没有办法告诉R忽略这些行并继续阅读表的其余部分?我试过try()但没有任何成功。

我已经阅读了一些关于忽略read.table()错误的相关帖子,但所有这些都谈到纠正违规行,这对我来说不是一个选项,因为文件是压缩的,我必须手动解压它们;而且可能还有几条这样的腐败线。

我的阅读代码(使用try块):

 try({dfApr4gw1 <- read.table(
     "log1.gz", header=FALSE, 
      col.names = c("time", "duration", "local ip", "squid result code", "bytes", "request method", "url", "user", "squid hierarchy code", "type"),
      na.strings="-",
      colClasses = c("numeric", "integer", "factor", "factor", "integer", "factor", "character", "character", "character", "factor")
  )})

1 个答案:

答案 0 :(得分:1)

可能适合您的用例的一个选项是在每行中读取一列,然后再用分隔符分隔该行,在您的情况下,该分隔符显示为逗号。您可以丢弃任何没有您期望的10列的行。

dfApr4gw1 <- read.table(
 "log1.gz", header=FALSE, col.names = c("column"), na.strings="-",
  colClasses = c("character"))

rows.keep <- apply(dfApr4gw1, 1, function(x) {
                                     if (length(strsplit(pangram, " ")[[1]]) == 10) {
                                         return TRUE
                                     } else {
                                         return FALSE
                                     }
                                 })

dfApr4gw1 <- dfApr4gw1[rows.keep, ]

现在dfApr4gw1只包含格式正确的行,您可以轻松地将其转换为具有10列相应类型的数据框。