继上周我的查询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"
因此当来自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,34,44.4,\" HIJK\032A \",99\r\n"
即。如果我在文件中读取二进制文件并转换为字符()后,它似乎工作...这对于大型CSV文件来说将是乏味的......
在R中错误地将Control-Z视为Windows上的文件结尾可能存在错误吗?
答案 0 :(得分:9)
我想我已经找到了解决方案 - 因为在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
}
答案 1 :(得分:3)
当我使用带有包含文件中间的SUB或CTRL-Z的csv文件的read.csv时,我也遇到了这个问题。
使用readr包解决它(如果您的文件以逗号分隔)
library(readr)
read_csv("h3.txt")
如果你有;作为分隔符,然后使用:
library(readr)
read_csv2("h3.txt")