Estoy cargando un archivo .csv como una cadena en R con readLines (). Una de las columnas contiene Tweets con saltos de línea no deseados.

Necesito eliminar los saltos de línea. En Notepad ++, Buscar: \r\n y Reemplazar con %%% funciona, y todo el archivo se convierte en una sola línea.

Sin embargo, al hacer esto en R, ni str_replace_all() ni str_remove_all() detectarán \\r\\n, y el archivo de salida es idéntico a la entrada. Este es mi codigo. He probado el siguiente RegEx: "\n"; "\r\n"; "\\n"; "\\r\\n"; "\\r" en vano.

tx  <- readLines("line_breaks.csv", warn = FALSE)

tx <- str_replace_all(tx, "\\r\\n", "")

write_lines(tx, "C:/Users/u0126720/Documents/csv_test/one_line.csv")

También he intentado:

tx <- str_remove_all(tx, "\\r\\n")

El archivo de entrada se ve así:

date,tweet
Wed Jun 19 2019, Como pretendia ser un angel , estando rodeada de demonios? ✨

Rp.🔥

hola, estas en la olla?"

Salida deseada (y lo que obtengo con Notepad ++):

Wed Jun 19 2019, Como pretendia ser un angel , estando rodeada de demonios? ✨Rp.🔥hola, estas en la olla?"
2
linguist_at_large 28 abr. 2020 a las 23:27

4 respuestas

La mejor respuesta

Hice una nueva respuesta porque la anterior no respondió el problema correcto, pero la dejé porque puede ser útil para otros.

Si su archivo es un archivo csv con el formato correcto, debería poder leerlo como csv incluso con el CRLF dentro de los datos.

tx  <- read.csv("line_breaks.csv", colClasses= stringsAsFactors = FALSE)

Sin embargo, desde su archivo de entrada de muestra parece que el csv no está bien formado (le falta un " después de la primera coma en la línea 2.

EDITAR: lo que sucede en su caso es que readLines está leyendo \r\n como una nueva línea (como debería) y el siguiente texto se coloca en la siguiente entrada del vector. Entonces \r\n no aparecerá en tx.

EDITAR: ¿Cómo está obteniendo sus archivos de entrada? Si puede arreglar ese método para producir archivos csv adecuados con citas, entonces R estará contento con él.

1
Mosquite 29 abr. 2020 a las 18:21

En mi caso, necesitaba asegurarme de que haya una línea por tweet, es decir, necesitaba eliminar todos los CRLF, excepto aquellos antes de una línea que comienza con la primera columna, es decir, la fecha. Resolví esto usando un marcador de posición %%% en lugar de LF, y luego agregando un LF antes de cada celda de la columna de fecha usando gsub() y una expresión regular:

tx <- paste(readLines("C:/Users/u0126720/Documents/csv_test/test.csv", encoding="UTF-8"), collapse="%%%")
tx <-gsub("(*UCP)(*UTF)%%%([S|M|T|W|F]{1}[u|o|e|h|r|a]{1}[n|e|d|u|i|t]{1} [J|F|M|A|S|O|N|D]{1}[a|e|p|u|c|o]{1}[n|b|r|y|l|g|p|t|v|c]{1})", "\n\\1", tx, ignore.case = FALSE, perl=TRUE, fixed=FALSE)

Esto da como resultado lo siguiente:

date, tweet
Wed Jun 19 2019, Como pretendia ser un angel , estando rodeada de demonios? ✨Rp.🔥hola, estas en la olla?"
Wed Jun 19 2019, RT @ignacioschmied: Mi hermano @maitan_69 está realizando

Etcetera.

0
linguist_at_large 30 abr. 2020 a las 10:30

Lo tengo funcionando para mí con gsub ("\ n", "", tx, fixed = T), que es R base. puede adaptarlo para eliminar ambos o ejecutarlo dos veces.

0
J_Alaniz 28 abr. 2020 a las 20:37

Tienes que usar cuatro barras invertidas para que coincida con una barra en la expresión regular de R. Esto se debe a que en regex, la barra diagonal inversa se usa para caracteres de control y algunos comodines, y en R, la barra diagonal inversa también se usa para caracteres de control. Entonces, si coloca "\\r" en R, la expresión regular lo verá como \r y luego tratará de hacer coincidir CR. Tratar:

tx <- str_replace_all(tx, "\\\\r\\\\n", "")
0
Mosquite 28 abr. 2020 a las 20:34