5

我有一个奇怪的文本文件,里面有一堆NUL字符(实际上大约有 10 个这样的文件),我想在 R 中以编程方式替换它们。是其中一个文件的链接。在这个问题的帮助下,我终于找到了一种比临时更好的 方法来进入每个文件并查找和替换讨厌的字符。事实证明,它们中的每一对都应该对应一个空格 ( [NUL][NUL]-> ) 以保持文件的预期线宽(这对于在以后将它们作为固定宽度读取至关重要)。

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

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

4

1 回答 1

10

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

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")替换 s 并在适当的位置处理字符串,例如,假设您想用一个空格替换两个NULs ( ):"\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__
于 2015-12-11T02:18:38.497 回答