微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Windows上用R中的SUB(1a)(Control-Z)字符读取文本文件

继上周 reading badly formed csv in R – mismatched quotes查询之后,这些相同的CSV文件也有嵌入的控制字符,例如ASCII Substitute Character,即十进制26或0x1A.不幸的是readLines()似乎截断了这个字符的行,所以我很难匹配引号 – 除了丢失这些行中的后面的字段!

我试过readBin()但是我无法读取这个文件.我担心我不能干净地把它读成R给你一个例子,我很难在R中创建这些.抱歉不能用一个干净的例子来证明.思考?

更新

现在我很困惑 – 当我使用代码

h3 <- paste('1,34,44.4,"',rawtochar(as.raw(c(as.integer(k1),26,65))),'",99')
 identical(readLines(textConnection(h3)),h3)

我得到TRUE,我觉得很惊讶!

更新2

h3
[1] "1,\" HIJK\032A \",99"
> writeLines(h3,'h3.txt')
> h3a <- readLines('h3.txt')
Warning message:
In readLines("h3.txt") : incomplete final line found on 'h3.txt'
> h3a
[1] "1,\" HIJK"

所以当来自textConnection()时,readLines()的反应会有所不同,并且它会在SUB字符处静截断.

如果它有所作为我会感到惊讶,但我在Windows-64上的2.15.2.

更新3

解决这个问题上有些模糊的成功……

zb <- file('h3.txt',"rb")
tmp <- readBin(zb,raw(),size=1,n=400) # raw is always of size =1
nchar(tmp)
# [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
close(zb)
tmp
# [1] 31 2c 33 34 2c 34 34 2e 34 2c 22 20 48 49 4a 4b 1a 41 20 22 2c 39 39 0d 0a
rawtochar(tmp)
# [1] "1,99\r\n"

即如果我在文件中读取二进制文件并转换为字符()后,它似乎工作…这对于大型CSV文件来说将是乏味的…

R中是否有错误将Control-Z错误地检测为Windows上的文件结尾?

我想我已经找到了解决方案 – 因为在Windows上的文件中间读取Control-Z似乎存在问题,我们需要以二进制/原始模式读取文件.
fnam <- 'h3.txt'
tmp.bin <- readBin(fnam,n=max(2*file.info(dfnam)$size,100))=1
tmp.char <- rawtochar(tmp.bin)
txt <- unlist(strsplit(tmp.char,'\r\n',fixed=TRUE))
txt

[1] "1,99"

更新
Duncan Murdoch向R-Devel refer发布了以下更好的答案.将其转换为我得到的函数

sReadLines <- function(fnam) {
    f <- file(fnam,"rb")
    res <- readLines(f)
    close(f)
    res
}

原文地址:https://www.jb51.cc/windows/365571.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐