删除" NUL"字符(在R内)

时间:2015-12-11 01:41:53

标签: r string nul

我有一个奇怪的文本文件,其中包含一堆NUL个字符(实际上大约有10个这样的文件),我想以编程方式从R.内部替换它们。{{ 3}}是其中一个文件的链接。 在Here问题的帮助下,我终于想出了一种比 ad-hoc 更好的方法来进入每个文件并找到并替换烦扰字符。事实证明,它们中的每一对应该对应于一个空格([NUL][NUL] - > )以保持文件的预期线宽(这对于将其作为固定宽度进一步向下读取至关重要这条路。)

然而,对于健壮性'为了这个解决方案,我更喜欢一种更加自动化的解决方案,理想情况下(出于组织的缘故),我可以在R脚本的开头添加一些东西,我正在写清理文件。 this问题看起来很有希望,但接受的答案是不够的 - readLines每当我尝试在这些文件上使用它时都会抛出错误(除非我激活skipNul)。

有没有办法将此文件的行放入R中,以便我可以使用gsub或其他任何方法来解决此问题而无需借助外部程序?

1 个答案:

答案 0 :(得分:9)

您希望将文件读取为二进制文件,然后您可以替换NUL,例如用空格替换它们:

r = readBin("00staff.dat", raw(), file.info("00staff.dat")$size)
r[r==as.raw(0)] = as.raw(0x20) ## replace with 0x20 = <space>
writeBin(r, "00staff.txt")
str(readLines("00staff.txt"))
#  chr [1:155432] "000540952Anderson            Shelley J       FW1949     2000R000000000000119460007620            3  0007000704002097907KGKG1616"| __truncated__ ...

你也可以用NUL替换一个非常罕见的字符(例如"\01")并对字符串进行处理,例如,如果你想要替换两个字符串,请说NUL s("\00\00")有一个空格:

r = readBin("00staff.dat", raw(), file.info("00staff.dat")$size)
r[r==as.raw(0)] = as.raw(1)
a = gsub("\01\01", " ", rawToChar(r), fixed=TRUE)
s = strsplit(a, "\n", TRUE)[[1]]
str(s)
# chr [1:155432] "000540952Anderson            Shelley J       FW1949     2000R000000000000119460007620            3  0007000704002097907KGKG1616"| __truncated__