2013-04-08 9 views
9

Theo sau truy vấn của tôi tuần trước reading badly formed csv in R - mismatched quotes, các tệp CSV này cũng có các ký tự điều khiển được nhúng như ASCII Substitute Character. 26 hoặc 0x1A. Thật không may readLines() dường như cắt ngắn dòng tại ký tự này, vì vậy tôi gặp khó khăn trong việc so khớp các dấu ngoặc kép - ngoài việc mất các trường sau trong các dòng này!đọc trong một tệp văn bản có ký tự SUB (1a) (Control-Z) trong R trên Windows

Tôi đã cố gắng readBin() nhưng tôi không thể đọc tệp này. Tôi e rằng tôi không thể đọc được điều này trong R để đưa ra một ví dụ và tôi gặp khó khăn trong việc tạo ra chúng trong R. Xin lỗi vì không thể chứng minh bằng một ví dụ rõ ràng. Suy nghĩ?

Cập nhật

Bây giờ tôi đang bối rối - khi tôi sử dụng mã

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

tôi nhận được TRUE mà tôi thấy khá ngạc nhiên!

Cập nhật 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" 

Vì vậy readlines() phản ứng khác nhau khi đến từ một textConnection() và nó âm thầm truncates tại nhân vật SUB.

Tôi sẽ ngạc nhiên nếu nó tạo sự khác biệt nhưng tôi ở mức 2,15,2 trên Windows-64.

Cập nhật 3

Một số thành công không rõ ràng trong việc giải quyết này ...

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" 

tức là nếu tôi đọc trong nội dung tập tin nhị phân và chuyển đổi sang nhân vật() sau đó nó dường như làm việc .. Điều này sẽ tẻ nhạt đối với các tệp CSV lớn ...

Có thể có lỗi trong R khi phát hiện không chính xác Control-Z khi kết thúc tệp trên cửa sổ không ??

Trả lời

8

Tôi nghĩ mình đã tìm ra giải pháp - vì có vẻ như đã xảy ra sự cố khi đọc Control-Z ở giữa tệp trên Windows, chúng tôi cần đọc tệp ở chế độ nhị phân/thô.

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" 

Cập nhật Câu trả lời tốt hơn sau đã được đăng bởi Duncan Murdoch cho R-Devel refer. Chuyển đổi nó thành một chức năng tôi nhận được:

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

Tôi cũng chạy vào vấn đề này khi tôi sử dụng read.csv với một tập tin csv có chứa các SUB hoặc CTRL-Z ở giữa của tập tin.

Giải quyết nó với gói readr (nếu tập tin của bạn được dấu phẩy tách ra)

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

Nếu bạn có một; làm dấu tách, sau đó sử dụng:

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