检查文件是否为二进制

时间:2015-05-08 15:03:41

标签: r binaryfiles

我希望有一个函数 SELECT * FROM (SELECT X_DATETIME_INSERT, X_USERID_INSERT , DB_ACC, ROW_ID, ACD_ACCIDENT_NO , GROUP_ROW_ID, NAME, ADDRESS_1 , ADDRESS_2, ADDRESS_3, ADDRESS_4, PHONE, INJURY, DELETE_ROW FROM EMSDBA.ACD_VICTIM ORDER BY x_datetime) WHERE rownum <= 100; ,它可以提供以下结果

is.binary

tmp_vec=1:3 save(tmp_vec,file="temp_vec.RData") write.csv(tmp_vec,"temp_vec.csv") is.binary("temp_vec.RData") #TRUE is.binary("temp_vec.csv") #FALSE 中是否有这样的功能? 我能想出的最佳解决方案是

R

显然,这个函数在处理大文件时效率不高。有没有更好的解决方案?谢谢!

编辑:我在Windows机器上。

1 个答案:

答案 0 :(得分:2)

计算机上的所有文件都是二进制文件。例外是那些恰好看起来像文本文件的例外。甚至那些可以使用不同的编码来实际正确读取文件。

如果您只想尝试区分save()write.csv()的结果,最简单的检查方法是文件是否已压缩。默认情况下,save()将压缩文件。您可以在文件中查找压缩的幻数。这是实现这一目标的一种方法

is_compressed <- function(filename, magic.number=as.raw(c("0x1f","0x8b"))) {
    fh<-file(filename, "rb")
    on.exit(close(fh))
    magic <- readBin(fh, "raw", length(magic.number))
    if(length(magic) != length(magic.number)) return(FALSE)
    if(all(magic == magic.number)) return(TRUE)
    return (FALSE)
}

这只需要读取文件的两个字节而不是整个文件。一旦你知道了它的压缩,你就可以尝试寻找rData文件的幻数。这是一个更完整的功能

is_rdata <- function(filename) {
    #check for magic number
    #https://github.com/wch/r-source/blob/b99d403f4b7337553acb2d2108c7a00e6c19f908/src/main/saveload.c#L1786

    fh <- if(!is_compressed(filename))
        file(filename, "rb")
    else {
        gzfile(filename, "rb")
    }
    on.exit(close(fh))


    magic <- rawToChar(readBin(fh, "raw", 5))
    if(nchar(magic)<5) return(FALSE)
    if(magic %in% c("RDA1\n","RDB1\n","RDX1\n","RDA2\n","RDB2\n","RDX2\n")) return(TRUE)
    return (FALSE)
}

我们可以用

进行测试
dd <- data.frame(a=1:4, b=letters[1:4])

save(dd, file="test1.file")
write.csv(dd, file="test2.file")

is_rdata("test1.file")
is_rdata("test2.file")

当然,如果您对文件扩展名非常小心,那么这可能是识别文件的最简单方法。