Como ler texto citado contendo aspas escapadas
Pergunta
Considere o seguinte arquivo separado por vírgula.Para simplificar, deixe-o conter uma linha:
'I am quoted','so, can use comma inside - it is not separator here','but can\'t use escaped quote :=('
Se você tentar lê-lo com o comando
table <- read.csv(filename, header=FALSE)
a linha será separada em 4 partes, pois a linha contém 3 vírgulas.Na verdade quero ler apenas 3 partes, uma das quais contém vírgula.O sinalizador de citação vem em busca de ajuda.Tentei:
table <- read.csv(filename, header=FALSE, quote="'")
mas isso cai com erro "incomplete final line found by readTableHeader on table"
.Isso acontece por causa do número ímpar (sete) de cotações.
read.table()
assim como scan()
tem parâmetro allowEscapes
, mas configurando-o para TRUE
não ajuda.Está tudo bem, porque de help(scan)
você pode ler:
As fugas que são interpretadas são os caracteres de controle ' a, b, f, n, r, t, v', ......Qualquer outro personagem escapado é tratado como por si só, incluindo barra de barragem
Por favor, sugira como você leria esses arquivos csv citados, contendo escape \'
citações.
Solução
Uma possibilidade é usar readLines()
para que tudo seja lido como está e, em seguida, substitua o caractere de aspas por outra coisa, por exemplo:
tt <- readLines("F:/temp/test.txt")
tt <- gsub("([^\\]|^)'","\\1\"",tt) # replace ' by "
tt <- gsub("\\\\","\\",tt) # get rid of the double escape due to readLines
Isso permite que você leia o vetor tt usando um textConnection
zz <- textConnection(tt)
read.csv(zz,header=F,quote="\"") # give text input
close(zz)
Não é a solução mais bonita, mas funciona (desde que você não tenha um caractere "em algum lugar do arquivo, é claro...)
Outras dicas
read_delim
do pacote ler pode lidar com aspas escapadas, usando os argumentos escape_double
e escape_backslash
.
read_delim(file, delim=',', escape_double=FALSE, escape_backslash=TRUE, quote="'")
(Observe que as versões mais antigas do readr não suportam novas linhas entre aspas nos cabeçalhos CSV corretamente: https://github.com/tidyverse/readr/issues/784)