2013-04-08 7 views
9

Po tym, jak z mojego zapytania w ubiegłym tygodniu reading badly formed csv in R - mismatched quotes, te same pliki CSV mają również wbudowane znaki sterujące, takie jak ASCII Substitute Character, który jest dziesiętny 26 lub 0x1A. Niestety, readLines() wydaje się obcinać linię przy tej postaci, więc mam trudności z dopasowaniem wycen - oprócz utraty późniejszych pól w tych liniach!czytanie w pliku tekstowym z SUB (1a) (Control-Z) znak w R na Windows

Próbowałem już readBin(), ale nie mogę go odczytać tego pliku. Obawiam się, że nie mogę tego dokładnie przeczytać na R, aby dać ci przykład i mam trudności z ich tworzeniem w R. Przykro mi, że nie mogę pokazać tego na czystym przykładzie. Myśli?

Aktualizacja

Teraz jestem zdezorientowany - kiedy użyć kodu

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

otrzymuję TRUE które znajdę dość zaskakujące!

Aktualizacja 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" 

So readlines() reaguje inaczej, gdy pochodzące z textConnection() i to po cichu obcina w charakterze pomocniczym.

Byłbym zaskoczony, gdyby to miało znaczenie, ale jestem na 2.15.2 na Windows-64.

Update 3

Niektóre niejasne sukces w rozwiązaniu tego ...

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" 

czyli jeśli czytam w pliku jako binarne i konwersji na postać() potem wydaje się działać .. To będzie żmudne dla dużych plików CSV ...

Czy może być błąd w R w niepoprawnym wykryciu Control-Z jako końca pliku w oknach?

Odpowiedz

8

Chyba znalazłem rozwiązanie - ponieważ pojawia się problem z odczytaniem kontrolki Z w środku pliku w systemie Windows, musimy odczytać plik w trybie binarnym/surowym.

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" 

Aktualizacja Poniższy lepsza odpowiedź została wysłana przez Duncan Murdoch do R-devel refer. Przekształcenie go w funkcji otrzymuję:

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

ja też wpadłem na ten problem, kiedy użyłem read.csv z pliku csv, który zawierał SUB lub Ctrl-Z w środku pliku.

rozwiązać go z pakietem readr (jeśli plik jest oddzielone przecinkiem)

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

Jeśli masz; jako separator, a następnie użyj:

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