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

StackOverflow https://stackoverflow.com/questions/6032296

Вопрос

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


'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', ......Любой другой сбежавший персонаж рассматривается как сам по себе, включая Backslash

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

Это было полезно?

Решение

Одна из возможностей — использовать 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)

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top