删除 "NUL" 个字符(在 R 中)

Removing "NUL" characters (within R)

我有一个奇怪的文本文件,里面有一堆 NUL 个字符(实际上大约有 10 个这样的文件),我想在 R 中以编程方式替换它们。Here 是其中一个文件的 link。 在 this 问题的帮助下,我终于想出了一个比 ad-hoc 更好的方法来进入每个文件并查找和替换令人讨厌的字符。事实证明,每对它们应该对应一个 space ([NUL][NUL]-></code>) 以保持文件的预期线宽(这对于将这些作为固定宽度阅读。</p> <p>但是,为了稳健性,我更喜欢一种更自动化的解决方案,理想情况下(为了组织)我可以在我正在编写的 R 脚本的开头添加一些东西来清理文件。 <a href="">This</a> 问题看起来很有希望,但接受的答案是不够的 - <code>readLines 每当我尝试在这些文件上使用它时都会抛出错误(除非我激活 skipNul)。

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

您想以二进制形式读取文件,然后您可以替换 NULs,例如将它们替换为 spaces:

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 替换为非常罕见的字符(例如 "")并在适当的位置处理字符串,例如,假设您要替换两个 NULs ("[=16=][=16=]") 和一个 space:

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