R中是否有本机方法来测试磁盘上的文件是ASCII文本文件还是二进制文件?类似于Linux中的file
命令,但是一种跨平台工作的方法?
file.info()
函数可以区分文件和目录,但似乎不会超出这个范围。
答案 0 :(得分:4)
如果你关心的是文件是ASCII还是二进制......
好吧,首先是定义。所有文件在某种程度上都是二进制文件:
is.binary <- function(file){
if(system.type() != "quantum computer"){
return(TRUE)
}else{
return(cat=alive&dead)
}
}
ASCII只是字符的编码系统。因此无法判断文件是ASCII还是二进制,因为ASCII-ness是一个解释问题。如果我保存文件并确定二进制数01001101是Q而01001110是Z,那么你可以将其解码为ASCII,但是你会得到错误的信息。幸运的是,美国人肌肉发达地说,“嘿,每个人都使用ASCII来编码他们的文字!你得到128个字符和一个校验位!哇!去美国!”。 IBM试图告诉人们使用EBCDIC,但没有人听过。这是一件好事。
所以每个人都将ASCII编码的文本打包成8位字节,并使用第8位进行奇偶校验。但随后人们停止进行奇偶校验,因为TCP / IP处理了所有这些,这也是一件好事,第八位预计为零。如果没有,那就有麻烦。
因为人们(读“微软”)开始滥用第八位,并编制自己的编码方案,所以除非你知道文件使用的是什么编码方案,否则你就被塞满了。并且该文件很少告诉您它是什么编码方案。现在我们有了Unicode甚至更多的编码方案。这是第三件好事。但我离题了。
现在当人们询问文件是否是二进制文件时,他们通常会问的是“此文件中的任何字节是否都设置了最高位?”。通过将原始文件连接作为无符号整数读取并测试最高值,可以在R中执行此操作。类似的东西:
is.binary <- function(filepath,max=1000){
f=file(filepath,"rb",raw=TRUE)
b=readBin(f,"int",max,size=1,signed=FALSE)
return(max(b)>128)
}
默认情况下,这只会检测前1000个字符。我认为file
命令做了类似的事情。
您可能想要更改测试以检查可打印的字符代码,空格,换行符,回车符以及您可能希望在非二进制文件中看起来合理的其他代码......
答案 1 :(得分:1)
我在几年前研究过 - 我记得,file(1)
个应用实际上读取了文件的前几个字节字节,并将其与存储在查找表中的内容进行了比较。听起来像是一个附加包的好候选人..
答案 2 :(得分:1)
?raw
手册的示例部分使用了这个:
isASCII <- function(txt) all(charToRaw(txt) <= as.raw(127))