Saltar al contenido

Cómo leer ” valores escapados entre comillas dobles con read.table en R

Si te encuentras con algún detalle que te causa duda puedes comentarlo y te responderemos lo más rápido posible.

Solución:

Me parece que read.table/read.csvNo puede manejar comillas escapadas.

… Pero creo que tengo una solución alternativa (fea) inspirada en @nullglob;

  • Primero lea el archivo SIN un carácter de comillas. (Esto no manejará incrustado , como señaló @Ben Bolker)
  • Luego pasa por el string columnas y eliminar las comillas:

El archivo de prueba se ve así (agregué un archivo que no esstring columna por si acaso):

13,"foo","Fab D"atri","bar"
21,"foo2","Fab D"atri2","bar2"

Y aquí está el código:

# 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
    

La salida es entonces correcta:

> tbl
  V1   V2          V3   V4
1 13  foo  Fab D"atri  bar
2 21 foo2 Fab D"atri2 bar2

En Linux/Unix (o en Windows con cygwin o GnuWin32), puede usar sed para convertir las comillas dobles escapadas " a comillas dobles duplicadas "" que puede ser manejado bien por read.csv:

p <- pipe(paste0('sed 's/\\"/""/g' "', FILENAME, '"'))
d <- read.csv(p, ...)
rm(p)

Efectivamente, lo siguiente sed El comando se utiliza para preprocesar la entrada CSV:

sed 's/\"/""/g' file.csv

No llamo a esto hermoso, pero al menos no tienes que salir del entorno R...

Mis disculpas de antemano porque esto no es más detallado: estoy justo en medio de una crisis de código.

Podría considerar usar la función scan(). Creé un archivo de muestra simple "sample.csv", que consta de:

V1,V2
"_:b5507F4C7x59005","Fabiana D"atri"

Dos posibilidades rápidas son (con la salida comentada para que pueda copiar y pegar en la línea de comando):

test <- scan("sample.csv", sep=",", what='character',allowEscapes=TRUE)
## Read 4 items
test
##[1] "V1"                "V2"                "_:b5507F4C7x59005"
##[4] "Fabiana D\atrin"

o

test <- scan("sample.csv", sep=",", what='character',comment.char="\")
## Read 4 items
test
## [1] "V1"                "V2"                "_:b5507F4C7x59005"
## [4] "Fabiana D\atrin"

Probablemente necesitarás jugar un poco más para obtener lo que quieres. Y veo que ya mencionaste writeLines, por lo que es posible que ya hayas probado esto. De cualquier manera, ¡buena suerte!

Sección de Reseñas y Valoraciones

No se te olvide compartir esta noticia si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *