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

标签 windows r parsing

继上周我的查询之后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,34,44.4,\" 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,34,44.4,\" HIJK"

所以 readLines() 在来自 textConnection() 时会有不同的 react ,它会在 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,34,44.4,\" HIJK\032A \",99\r\n"

即如果我以二进制形式读入文件并在之后转换为 character() 它似乎可以工作......这对于大型 CSV 文件来说将是乏味的......

在 Windows 上错误地将 Control-Z 检测为文件结尾时,R 中是否存在错误??

最佳答案

我想我已经找到了解决方案 - 因为在 Windows 上读取文件中间的 Control-Z 似乎有问题,我们需要以二进制/原始模式读取文件。

fnam <- 'h3.txt'
tmp.bin <- readBin(fnam, raw(), size=1, 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,34,44.4,\" HIJK\032A \",99"

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

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

关于windows - 在 Windows 上的 R 中读取带有 SUB (1a) (Control-Z) 字符的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874619/

相关文章:

linux - 在 Windows 10 上通过 Linux 子系统使用批处理文件?

c++ - 解析 HHMMSS 来自 NMEA

java - 使用 DOM 将 XML 解析为 HashMap

java - 解析一个非常复杂的嵌套 json,其结构在 JAVA 中总是在变化

c++ - 未插入 Windows API 组合框数据

php - 如何在品牌 exe/dmg 安装程序中打包 chrome 浏览器?

c# - 当使用可执行文件的完整路径,以管理员身份运行时,Windows 10 无法访问指定的设备、路径或文件

r - ggplot 中带有 scale_y_log10 的 stat_summary 错误?

r - 使dcast中的drop参数仅查看公式的RHS

java - 将 R 连接到远程服务器上的 Hive