我希望有一个函数 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机器上。
答案 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")
当然,如果您对文件扩展名非常小心,那么这可能是识别文件的最简单方法。