2015-10-16 113 views
4

我有一个包含约700个文本文件的文件夹,我想要导入并添加一列。我已经想出了如何使用以下代码执行此操作:如何在R中导入文本文件时跳过空文件?

files = list.files(pattern = "*c.txt") 
DF <- NULL 
for (f in files) { 
    data <- read.table(f, header = F, sep=",") 
    data$species <- strsplit(f, split = "c.txt") <-- (column name is filename) 
    DF <- rbind(DF, data) 
} 
write.xlsx(DF,"B:/trends.xlsx") 

问题是,大约有100个文件是空的。因此代码停止在第一个空文件和我得到这个错误消息:

错误函数read.table中(F,标题= F,九月=“”):可用 无线输入

有没有办法跳过这些空文件?

谢谢!

+0

你知道如何检查文件是否为空?你可以添加一个if语句('if(file is not empty){do something}')。值得注意的是:如果您遇到性能问题,那么有更高效的方法来做到这一点。多次调用rbind可能会很慢。 – Heroka

回答

1

对于不同的方法,引入明确的错误处理,想想tryCatch处理别的坏在你read.table可能发生。

for (f in files) { 
    data <- tryCatch({ 
     if (file.size(f) > 0){ 
     read.table(f, header = F, sep=",") 
      } 
     }, error = function(err) { 
      # error handler picks up where error was generated 
      print(paste("Read.table didn't work!: ",err)) 
     }) 
    data$species <- strsplit(f, split = "c.txt") 
    DF <- rbind(DF, data) 
} 
3

您可以通过检查file.size(some_file) > 0跳过空文件:

files <- list.files("~/tmp/tmpdir", pattern = "*.csv") 
## 
df_list <- lapply(files, function(x) { 
    if (!file.size(x) == 0) { 
     read.csv(x) 
    } 
}) 
## 
R> dim(do.call("rbind", df_list)) 
#[1] 50 2 

这跳过了10个文件是空的,并且在没有其他10读取。


数据:

for (i in 1:10) { 
    df <- data.frame(x = 1:5, y = 6:10) 
    write.csv(df, sprintf("~/tmp/tmpdir/file%i.csv", i), row.names = FALSE) 
    ## empty file 
    system(sprintf("touch ~/tmp/tmpdir/emptyfile%i.csv", i)) 
}