我有一个程序可以生成制表符分隔值文件(* .tsv)作为更大分析管道的一部分。这些tsv文件有四个注释标题行,每行以#开头(下面带有行前缀的示例和后面的内容说明)。
#Version ProgramNameAndVersion
#CL CommandListing
#TEMPLATE-SDF-ID FileName
#abundance IgnoredHeaderNames
在此标题之后,通常会有大量数据行,我可以读取并操作而没有问题。但很少,该程序会写出仍然有注释标题行的tsv,否则为空。我正在寻找一种好方法来检查tsv文件是否为空,然后我尝试导入它并获得输入中没有可用的行"错误。
通常情况下,我会使用:
info=file.info(ListOfFileNames)
empty = rownames(info[info$size == 0, ])
如[{3}}所述。但是tsv文件并不是真正空的,只是没有数据。另外,我不能仅仅将大小的截止值移动到不同的不同值,因为标题行中包含的详细信息会因文件而异,我发现"空"文件大小大于具有单行数据的文件的文件。
对于检查这些文件是否包含除#标题行之外的任何数据的方法,我将不胜感激。
答案 0 :(得分:1)
有几种想法:
在尝试阅读之前检查文件的第5行:
length(readLines(filename, n = 5)[-(1:4)]) > 0
使用readr
,这仍然可以为您提供一个空的data.frame(tibble
,实际上),但没有错误:
readr::read_delim(filename, delim="\t", comment="#")
捕获错误(可能是矫枉过正,也许使用withCallingHandlers
做得更好):
tryCatch(read.delim(filename, sep="\t", comment.char="#"),
error = function(e) {
if (grepl("no lines available in input", e)) {
return(data.frame())
} else {
stop(e)
}
})