У меня проблемы с чтением файла, содержащего строки, подобные приведенной ниже в R.
"_:b5507F4C7x59005","Fabiana D\"atri"
Любая идея? Как я могу заставить read.table понять, что\"это выход из цитаты?
Ура, Александр
У меня проблемы с чтением файла, содержащего строки, подобные приведенной ниже в R.
"_:b5507F4C7x59005","Fabiana D\"atri"
Любая идея? Как я могу заставить read.table понять, что\"это выход из цитаты?
Ура, Александр
Мне кажется, что read.table/read.csv
не может обрабатывать скрытые кавычки.
... Но я думаю, что у меня (уродливое) обход, вдохновленный @nullglob;
,
, как отметил @Ben Bolker)Тестовый файл выглядит следующим образом (я добавил столбцы, отличные от строки):
13,"foo","Fab D\"atri","bar"
21,"foo2","Fab D\"atri2","bar2"
И вот код:
# Generate test file
writeLines(c("13,\"foo\",\"Fab D\\\"atri\",\"bar\"",
"21,\"foo2\",\"Fab D\\\"atri2\",\"bar2\"" ), "foo.txt")
# Read ignoring quotes
tbl <- read.table("foo.txt", as.is=TRUE, quote='', sep=',', header=FALSE, row.names=NULL)
# Go through and cleanup
for (i in seq_len(NCOL(tbl))) {
if (is.character(tbl[[i]])) {
x <- tbl[[i]]
x <- substr(x, 2, nchar(x)-1) # Remove surrounding quotes
tbl[[i]] <- gsub('\\\\"', '"', x) # Unescape quotes
}
}
Результат корректен:
> tbl
V1 V2 V3 V4
1 13 foo Fab D"atri bar
2 21 foo2 Fab D"atri2 bar2
В Linux/Unix (или в Windows с cygwin или GnuWin32) вы можете использовать sed
для преобразования скрытых двойных кавычек \"
в двойные двойные кавычки ""
, которые можно хорошо обрабатывать с помощью read.csv
:
p <- pipe(paste0('sed \'s/\\\\"/""/g\' "', FILENAME, '"'))
d <- read.csv(p, ...)
rm(p)
Фактически для предварительной обработки ввода CSV используется следующая команда sed
:
sed 's/\\"/""/g' file.csv
Я не называю это красивым, но по крайней мере вам не нужно покидать среду R...
Мои извинения досрочно, что это не более подробно - я прямо в середине хруста.
Вы можете использовать функцию scan(). Я создал простой пример файла sample.csv, который состоит из:
V1,V2
"_:b5507F4C7x59005","Fabiana D\"atri"
Две быстрых возможности (с комментариями к выпуску, чтобы вы могли скопировать-вставить в командную строку):
test <- scan("sample.csv", sep=",", what='character',allowEscapes=TRUE)
## Read 4 items
test
##[1] "V1" "V2" "_:b5507F4C7x59005"
##[4] "Fabiana D\\atri\n"
или
test <- scan("sample.csv", sep=",", what='character',comment.char="\\")
## Read 4 items
test
## [1] "V1" "V2" "_:b5507F4C7x59005"
## [4] "Fabiana D\\atri\n"
Вам, вероятно, придется поиграть с ним немного больше, чтобы получить то, что вы хотите. И я вижу, что вы уже упоминали writeLines, так что вы, возможно, уже пробовали это. В любом случае, удачи!
Мне удалось заставить ваш eample работать, установив аргумент quote
:
> read.csv('test.csv',quote="'",head=FALSE)
V1 V2
1 "_:b5507F4C7x59005" "Fabiana D\\"atri"
2 "_:b5507F4C7x59005" "Fabiana D\\"atri"
read_delim
из пакета readr может обрабатывать экранированные и удвоенные двойные кавычки, используя аргументы escape_double
и escape_backslash
.
Например, если наш файл экранирует кавычки, удваивая их:
"quote""","hello"
1,2
тогда мы используем
read_delim(file, delim=',') # default escape_backslash=FALSE, escape_double=TRUE
Если наш файл экранирует кавычки с обратной косой чертой:
"quote\"","hello"
1,2
мы используем
read_delim(file, delim=',', escape_double=FALSE, escape_backslash=TRUE)
Это должно быть хорошо с read.csv()
. Взгляните на справку ?read.csv
- опция для указания цитаты quote = "...."
. В этом случае, однако, может возникнуть проблема: кажется, что read.csv()
предпочитает видеть соответствующие кавычки.
Я пробовал то же самое с read.table("sample.txt", header = FALSE, as.is = TRUE)
, с текстом в sample.txt
, и, похоже, он работает. Когда все остальное терпит неудачу с read.csv()
, я стараюсь вернуться к read.table()
и тщательно указать параметры.