删除 "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
或其他任何方法来解决此问题而无需借助外部程序?
您想以二进制形式读取文件,然后您可以替换 NUL
s,例如将它们替换为 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
替换为非常罕见的字符(例如 ""
)并在适当的位置处理字符串,例如,假设您要替换两个 NUL
s ("[=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__
我有一个奇怪的文本文件,里面有一堆 NUL
个字符(实际上大约有 10 个这样的文件),我想在 R 中以编程方式替换它们。Here 是其中一个文件的 link。
在 this 问题的帮助下,我终于想出了一个比 ad-hoc 更好的方法来进入每个文件并查找和替换令人讨厌的字符。事实证明,每对它们应该对应一个 space ([NUL][NUL]
-></code>) 以保持文件的预期线宽(这对于将这些作为固定宽度阅读。</p>
<p>但是,为了稳健性,我更喜欢一种更自动化的解决方案,理想情况下(为了组织)我可以在我正在编写的 R 脚本的开头添加一些东西来清理文件。 <a href="">This</a> 问题看起来很有希望,但接受的答案是不够的 - <code>readLines
每当我尝试在这些文件上使用它时都会抛出错误(除非我激活 skipNul
)。
有什么方法可以将此文件的行放入 R 中,以便我可以使用 gsub
或其他任何方法来解决此问题而无需借助外部程序?
您想以二进制形式读取文件,然后您可以替换 NUL
s,例如将它们替换为 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
替换为非常罕见的字符(例如 ""
)并在适当的位置处理字符串,例如,假设您要替换两个 NUL
s ("[=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__