Как читать цитируемый текст, содержащий экранированные кавычки - PullRequest
10 голосов
/ 17 мая 2011

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


'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-файлы, содержащие экранированные \' кавычки.

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

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

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

0 голосов
/ 24 мая 2019

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)

...