R中的本机方法,用于测试文件是否为ascii

时间:2013-05-03 01:18:01

标签: r cran

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

file.info()函数可以区分文件和目录,但似乎不会超出这个范围。

3 个答案:

答案 0 :(得分:4)

如果你关心的是文件是ASCII还是二进制......

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

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

ASCII只是字符的编码系统。因此无法判断文件是ASCII还是二进制,因为ASCII-ness是一个解释问题。如果我保存文件并确定二进制数0100​​1101是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))