Advertencia de 'línea final incompleta' al intentar leer un archivo .csv en R

114

Estoy tratando de leer un archivo .csv en R y al usar esta fórmula:

pheasant<-read.table(file.choose(),header=TRUE,sep=",")

Recibo este mensaje de advertencia:

"incomplete final line found by readTableHeader on 'C:\Documents and Settings..."

Hay un par de cosas que pensé que podrían haber causado esta advertencia, pero desafortunadamente no sé lo suficiente sobre R para diagnosticar el problema por mí mismo, así que pensé en publicar aquí con la esperanza de que alguien más pueda diagnosticarlo por mí.

  • el archivo .csv era originalmente un archivo de Excel, que guardé en formato .csv
  • el archivo consta de tres columnas de datos
  • cada columna de datos tiene una longitud diferente, es decir, hay un número diferente de valores en cada columna
  • Quiero comparar las medias (usando la prueba t o equivalente dependiendo de la distribución normal / no normal) de dos de las columnas a la vez, por ejemplo, prueba t entre los valores de la columna 1 y los valores de la columna 2, luego una t- prueba de los valores de la columna 1 y de la columna 3, etc.

¡Cualquier ayuda o sugerencia será muy apreciada!

Kate
fuente
1
@Kate: ¿podrías vincularnos al archivo en sí? Tengo algunas ideas, pero es difícil decir cuál es el problema sin tener el archivo.
Joris Meys
Hola Joris - No sé cómo hacer eso, lo siento ...
Kate
La primera columna tiene 1045 valores, la segunda tiene 623 valores y la tercera tiene 871 si eso ayuda ...? Todos son valores numéricos en números enteros y medios, es decir, 23, 24,5, etc.
Kate
1
Creo que ese es el problema, porque read.table coloca sus datos en un marco de datos, que debe tener la misma longitud de columna.
Sir Ksilem
1
@James: No, no lo es. readTableHead (la función c subyacente) lee las primeras 5 líneas. El error se origina ahí.
Joris Meys

Respuestas:

134

El mensaje indica que la última línea del archivo no termina con un carácter de fin de línea (EOL) (salto de línea ( \n) o retorno de carro + salto de línea ( \r\n)). La intención original de este mensaje era advertirle que el archivo puede estar incompleto; la mayoría de los archivos de datos tienen un carácter EOL como último carácter del archivo.

El remedio es simple:

  1. Abre el archivo
  2. Navegue hasta la última línea del archivo
  3. Coloque el cursor al final de esa línea
  4. prensa return
  5. Guarda el archivo
Hendrik Pon
fuente
2
No es la última línea del archivo. Es el encabezado que está leyendo, que son sus primeras cinco líneas.
Joris Meys
@JorisMeys El mensaje de error, sin embargo, se refiere a la última línea del archivo. Seguir los pasos anteriores elimina la advertencia.
WorldGov
@WorldGov "línea final incompleta" es una advertencia (no un error) que puede aparecer debido a diferentes causas. En su caso, esa es la falta de una EOL final. No hay forma de que, en su caso, la función readTableHeader haya lanzado la advertencia, porque esa no lee la línea final. Por lo tanto, su problema no es el mismo que el del OP.
Joris Meys
20

El problema es fácil de resolver; es porque la última línea DEBE estar vacía.

Diga, si su contenido es

line 1,
line2

cámbialo a

line 1,
line2
(empty line here)

Hoy me encontré con este tipo de problema, cuando intentaba usar R para leer un archivo JSON, usando el comando a continuación:

json_data<-fromJSON(paste(readLines("json01.json"), collapse=""))

; y lo resuelvo con mi método anterior.

Vincent Jia
fuente
1
usando un plomero para alojar una API de R, tuve el mismo problema. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'La advertencia se resolvió agregando una línea vacía al final. No estoy seguro de por qué ocurre esto.
HoofarLotusX
Igual que aquí. Gracias.
Megadeth
14

¿Está realmente seguro de haber seleccionado el archivo .csv y no el archivo .xls? Solo puedo reproducir el error si intento leer un archivo .xls. Si intento leer un archivo .csv o cualquier otro archivo de texto, es imposible recrear el error que aparece.

> Data <- read.table("test.csv",header=T,sep=",")
> Data <- read.table("test.xlsx",header=T,sep=",")
Warning message:
In read.table("test.xlsx", header = T, sep = ",") :
  incomplete final line found by readTableHeader on 'test.xlsx'

readTableHeades la función c que da el error. Intenta leer en las primeras n líneas (estándar las primeras 5) para determinar el tipo de datos. El resto de los datos se lee usando scan(). Entonces el problema es el formato del archivo.

Una forma de averiguarlo es establecer el directorio de trabajo en el directorio donde está el archivo. De esa manera, verá la extensión del archivo que leyó. Sé que en Windows no se muestra de manera estándar, por lo que puede creer que es csv mientras no lo es.

Lo siguiente que debe hacer es abrir el archivo en el Bloc de notas o Wordpad (u otro editor) y verificar que el formato sea equivalente a mi archivo test.csv:

Test1,Test2,Test3
1,1,1
2,2,2
3,3,3
4,4,
5,5,
,6,

Este archivo le dará el siguiente marco de datos:

> read.table(testfile,header=T,sep=",")
  Test1 Test2 Test3
1     1     1     1
2     2     2     2
3     3     3     3
4     4     4    NA
5     5     5    NA
6    NA     6    NA

El formato csv guardado por Excel separa todas las celdas con una coma. Las celdas vacías simplemente no tienen valor. read.table()puede lidiar con esto fácilmente y reconoce las celdas vacías sin problemas.

Joris Meys
fuente
Suponiendo que se trata de un entorno de Windows 7, si Kate mira el archivo copiado en el escritorio o dentro de la carpeta, el icono de un archivo .csv tiene una "a", mientras que un archivo .xlsx tiene un icono que se ve más como una hoja de trabajo. Esta es una forma visual rápida de determinar el tipo de archivo. Es mucho más fácil de ver cuando se guarda en el escritorio, ya que los iconos son más grandes. :)
Michelle
7

Utilice readLines()(con warn = FALSE) para leer el archivo en un vector de caracteres primero.

Después de eso, use la text =opción para leer el vector en un marco de datos conread.table()

    pheasant <- read.table( 
        text = readLines(file.choose(), warn = FALSE), 
        header = TRUE,  
        sep = "," 
    )
Damian
fuente
3

Me di cuenta de que se han proporcionado varias respuestas, pero aún no hay una solución real.

El motivo, como se mencionó anteriormente, es que falta un "Fin de línea" al final del archivo CSV.

Si bien la solución real debería provenir de Microsoft, el camino es abrir el archivo CSV con un editor de texto y agregar una línea al final del archivo (también conocido como presionar la tecla de retorno). Utilizo el software ATOM como editor de texto / código, pero prácticamente cualquier editor de texto básico funcionaría.

Mientras tanto, informe el error a Microsoft.

Pregunta: Me parece que es un problema de Office 2016. ¿Alguien tiene el problema en una PC?

Nicolas Stifani
fuente
2

Recibí el mismo mensaje. Mi solución incluyó: eliminé todas las hojas adicionales (pestañas) en el archivo .csv, eliminé los caracteres no numéricos, volví a guardar el archivo como delimitado por comas y lo cargué en R v 2.15.0 usando un lenguaje estándar:

nombre de archivo <-read.csv ("nombre de archivo", encabezado = TRUE)

Como medida de seguridad adicional, cerré el software y lo volví a abrir antes de cargar el csv.

erik
fuente
2

En varias configuraciones regionales europeas, como el carácter de coma sirve como punto decimal, se debe usar la función read.csv2 en su lugar.

yifan
fuente
2

He resuelto este problema al cambiar la codificación en el argumento read.table de fileEncoding = "UTF-16" a fileEncoding = "UTF-8".

Dejan Pljevljakusic
fuente
1

El problema que estás describiendo se me ocurrió cuando cambié el nombre de un .xlsxas .csv.

Lo que me solucionó fue "Guardar como" y luego guardarlo como de .csvnuevo.

Jase
fuente
1

Tuve este problema una vez cuando tenía una cita simple como parte del encabezado. Cuando lo eliminé (es decir, renombré el encabezado de la columna respectiva de Jimmy's dataa Jimmys data), la función no devolvió advertencias.

Loukdelouk
fuente
1

Para solucionar este problema a través de R, utilicé en read.xlsx(..)lugar de un read.csv(). ¡¡Funciona de maravilla!! Ni siquiera tiene que cambiar el nombre. Cambiar el nombre de un xlsx a csv no es una solución viable.

Digvijay Sawant
fuente
#Digvijay_Sawant, no estoy seguro de a qué te refieres con tu último comentario, pero a diferencia de cualquier otra solución aquí (probé casi todas: ¡enloquecedor!), La tuya fue la única que funcionó.
W Barker
1
@WBarker En la pregunta original, el autor guardó el Excel en un csv y luego intentó leerlo. Bueno, convertir un Excel a csv puede cambiar cosas como formatos de datos, puede ocurrir pérdida de datos, etc. Excel puede almacenar un "final de archivo" en un formato diferente al de un csv, lo que puede hacer que la función sea difícil de determinar dónde termina el archivo. Bueno, no soy un experto, solo un pensamiento :-)
Digvijay Sawant
0

Abra el archivo en text wrangler o notepad ++ y muestre el formato, por ejemplo, en text wrangler muestra invisibles. De esa manera, puede ver la nueva línea o los caracteres de las pestañas. A menudo, Excel agregará todo tipo de pestañas en los lugares incorrectos y no un último carácter de línea nueva, pero debe mostrar los símbolos para ver esto.

prepagam
fuente
0

Mi solución fue que abrí el csvarchivo en un editor de texto, eliminé las comas excesivas en el último valor y luego guardé el archivo. Por ejemplo para el siguiente archivo

Test1,Test2,Test3
1,1,1
2,2,2
3,3,3
4,4,
5,5,
,6,,

Quite las comas después de 6, luego guarde el archivo.

Chase Wright
fuente
0

Experimenté un problema similar, sin embargo, esto parece una advertencia genérica y, de hecho, es posible que no esté relacionado con el carácter de final de línea. En mi caso estaba dando este error porque el archivo que estaba usando contenía caracteres cirílicos, una vez que los reemplacé por caracteres latinos, el error desapareció.

Imer Muhović
fuente
0

Probé diferentes soluciones, como usar un editor de texto para insertar una nueva línea y obtener el carácter de final de línea como se recomienda en la respuesta superior anterior. Ninguno de estos funcionó, desafortunadamente.

La solución que finalmente funcionó para mí fue muy simple: copié y pegué el contenido de un archivo CSV en un nuevo archivo CSV en blanco, lo guardé y el problema desapareció.

Rens
fuente