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.csv
No 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.