2013-04-08 56 views
9

用SUB(1A)(控制-Z)字符中的R讀取文本文件從上週reading badly formed csv in R - mismatched quotes我的查詢繼,這些相同的CSV文件也有嵌入式控制字符,如ASCII Substitute Character這是十進制26或0x1A。不幸的是readLines()似乎在這個字符處截斷了行,所以我很難匹配引號 - 除了丟失這些行中的後面的字段!在Windows

我試圖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()到來時的反應不同,它在SUB字符默默截斷。

,如果它的確與衆不同,但我在2.15.2在Windows上,64我會感到驚訝。

更新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中不正確地檢測控制-Z作爲Windows文件結束?

回答

8

我想我已經找到了一個解決方案 - 因爲似乎是在Windows上的文件中讀取控制-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" 

更新 下更好的答案被張貼鄧肯默多克R-傑韋利refer。它轉換成一個函數,我得到:

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

我也遇到了這個問題,當我用read.csv與包含SUB或CTRL-Z在文件中間的CSV文件。

與readr包解決它(如果你的文件用逗號隔開)

library(readr) 
read_csv("h3.txt") 

如果你有一個;作爲隔板,然後使用:

library(readr) 
read_csv2("h3.txt")