Как читать "двойные кавычки" экранированные значения с помощью read.table в R

У меня проблемы с чтением файла, содержащего строки, подобные приведенной ниже в R.

"_:b5507F4C7x59005","Fabiana D\"atri"

Любая идея? Как я могу заставить read.table понять, что\"это выход из цитаты?

Ура, Александр

Ответ 1

Мне кажется, что 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

Ответ 2

В 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...

Ответ 3

Мои извинения досрочно, что это не более подробно - я прямо в середине хруста.

Вы можете использовать функцию 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, так что вы, возможно, уже пробовали это. В любом случае, удачи!

Ответ 4

Мне удалось заставить ваш eample работать, установив аргумент quote:

> read.csv('test.csv',quote="'",head=FALSE)
                   V1                  V2
1 "_:b5507F4C7x59005" "Fabiana D\\"atri" 
2 "_:b5507F4C7x59005" "Fabiana D\\"atri" 

Ответ 5

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)

Ответ 6

Это должно быть хорошо с read.csv(). Взгляните на справку ?read.csv - опция для указания цитаты quote = "....". В этом случае, однако, может возникнуть проблема: кажется, что read.csv() предпочитает видеть соответствующие кавычки.

Я пробовал то же самое с read.table("sample.txt", header = FALSE, as.is = TRUE), с текстом в sample.txt, и, похоже, он работает. Когда все остальное терпит неудачу с read.csv(), я стараюсь вернуться к read.table() и тщательно указать параметры.