3

R 中是否有本地方法来测试磁盘上的文件是 ASCII 文本文件还是二进制文件?类似于fileLinux 中的命令,但是一种可以跨平台工作的方法?

file.info()函数可以将文件与目录区分开来,但似乎并没有超出此范围。

4

3 回答 3

4

如果您只关心文件是 ASCII 还是二进制文件...

好吧,首先定义。所有文件在某种程度上都是二进制的:

is.binary <- function(file){
  if(system.type() != "quantum computer"){
    return(TRUE) 
  }else{
    return(cat=alive&dead)
  }
}

ASCII 只是字符的编码系统。因此不可能判断一个文件是 ASCII 还是二进制文件,因为 ASCII 是一个解释问题。如果我保存一个文件并确定二进制数 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命令做了类似的事情。

您可能想要更改测试以检查可打印的字符代码、空格、换行符、回车以及您可能希望在非二进制文件中认为合理的其他代码......

于 2013-05-03T07:13:23.373 回答
1

那么,你会怎么做呢?我猜你不能不阅读(部分或全部)文件,这就是为什么使用文件扩展名来表示内容类型的原因。

几年前我研究过——我记得,file(1)应用程序实际上读取了文件的前几个头字节,并将其与查找表中存储的内容进行比较。对我来说,这听起来像是一个很好的附加包候选人..

于 2013-05-03T01:21:59.990 回答
1

手册的示例部分?raw使用了这个:

isASCII <-  function(txt) all(charToRaw(txt) <= as.raw(127))
于 2013-06-13T23:09:16.157 回答