检查具有注释标头的tsv文件是否为空

时间:2016-09-09 16:02:50

标签: r

我有一个程序可以生成制表符分隔值文件(* .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文件并不是真正空的,只是没有数据。另外,我不能仅仅将大小的截止值移动到不同的不同值,因为标题行中包含的详细信息会因文件而异,我发现"空"文件大小大于具有单行数据的文件的文件。

对于检查这些文件是否包含除#标题行之外的任何数据的方法,我将不胜感激。

1 个答案:

答案 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)
               }
             })