Как читать цитируемый текст, содержащий экранированные кавычки

Рассмотрим следующий файл с разделителями-запятыми. Для простоты пусть она содержит одну строку:


'I am quoted','so, can use comma inside - it is not separator here','but can\'t use escaped quote :=('

Если вы попытаетесь прочитать его с помощью команды

table <- read.csv(filename, header=FALSE)

линия будет разделена на 4 части, потому что строка содержит 3 запятые. На самом деле я хочу читать только 3 части, одна из которых содержит запятую. Там флаг цитаты приходит за помощью. Я пробовал:

table <- read.csv(filename, header=FALSE, quote="'")

но это падает с ошибкой "incomplete final line found by readTableHeader on table". Это происходит из-за нечетного (семи) числа котировок.

read.table(), а также scan() имеют параметр allowEscapes, но установка его на TRUE не помогает. Это нормально, причина от help(scan) вы можете прочитать:

Эскапады, которые интерпретируются, являются управляющими символами           '\ A,\b,\f,\n,\r,\t,\v,...   ... Любой другой сбежал           символ рассматривается как сам, включая обратную косую черту

Пожалуйста, предложите, как бы вы читали такие цитированные csv файлы, содержащие escape-кавычки \'.

Ответ 1

Одна из возможностей состоит в том, чтобы использовать readLines(), чтобы все было прочитано как есть, а затем продолжить заменой символа кавычки чем-то другим, например:

tt <- readLines("F:/temp/test.txt")
tt <- gsub("([^\\]|^)'","\\1\"",tt) # replace ' by "
tt <- gsub("\\\\","\\",tt) # get rid of the double escape due to readLines

Это позволяет вам прочитать вектор tt с помощью textConnection

zz <- textConnection(tt)
read.csv(zz,header=F,quote="\"") # give text input
close(zz)

Не самое красивое решение, но оно работает (при условии, что у вас нет символа где-нибудь в файле с курса...)

Ответ 2

read_delim из пакета readr может обрабатывать экранированные кавычки, используя аргументы escape_double и escape_backslash.

read_delim(file, delim=',', escape_double=FALSE, escape_backslash=TRUE, quote="'")

(Обратите внимание, что более старые версии readr не поддерживают правильно заключенные в новые строки в заголовках CSV: https://github.com/tidyverse/readr/issues/784)