Avviso "riga finale incompleta" quando si tenta di leggere un file .csv in R


114

Sto cercando di leggere un file .csv in R e dopo aver utilizzato questa formula:

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

Ricevo questo messaggio di avviso:

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

Ci sono un paio di cose che pensavo potessero aver causato questo avviso, ma sfortunatamente non so abbastanza su R per diagnosticare il problema da solo, quindi ho pensato di pubblicare qui nella speranza che qualcun altro possa diagnosticare per me!

  • il file .csv era originariamente un file Excel, che ho salvato in formato .csv
  • il file comprende tre colonne di dati
  • ogni colonna di dati ha una lunghezza diversa, cioè ci sono un numero diverso di valori in ogni colonna
  • Voglio confrontare le medie (usando t-test o equivalente a seconda della distribuzione normale / non normale) di due delle colonne alla volta, quindi per esempio, t-test tra i valori della colonna 1 e i valori della colonna 2, quindi un t- test dei valori della colonna 1 e della colonna 3, ecc.

Qualsiasi aiuto o suggerimento sarebbe seriamente apprezzato!


1
@Kate: potresti collegarci al file stesso? Ho alcune idee, ma è difficile dire quale sia il problema senza avere il file.
Joris Meys

Ciao Joris - Non sono sicuro di come farlo, scusa ...
Kate

La prima colonna ha 1045 valori, la seconda ha 623 valori e la terza ha 871 se questo aiuta ...? Sono tutti valori numerici in numeri interi e mezzi numeri, cioè 23, 24,5 ecc ...
Kate

1
Penso che questo sia il problema, perché read.table mette i tuoi dati in un data frame, che deve avere colonne di lunghezza uguale.
Sir Ksilem

1
@ James: No, non lo è. readTableHead (la funzione c sottostante) legge le prime 5 righe. L'errore ha origine lì.
Joris Meys

Risposte:


134

Il messaggio indica che l'ultima riga del file non termina con un carattere di fine riga (EOL) (avanzamento riga ( \n) o ritorno a capo + avanzamento riga ( \r\n)). L'intenzione originale di questo messaggio era di avvertirti che il file potrebbe essere incompleto; la maggior parte dei file di dati ha un carattere EOL come ultimo carattere nel file.

Il rimedio è semplice:

  1. Apri il file
  2. Vai all'ultima riga del file
  3. Posiziona il cursore alla fine di quella riga
  4. stampa return
  5. Salva il file

2
Non è l'ultima riga del file. È l'intestazione che sta leggendo, ovvero le tue prime cinque righe.
Joris Meys

@JorisMeys Il messaggio di errore, tuttavia, fa riferimento all'ultima riga del file. Effettuare i passaggi precedenti rimuove effettivamente l'avviso.
WorldGov

@WorldGov "riga finale incompleta" è un avviso (non un errore) che può apparire a causa di diverse cause. Nel tuo caso questa è la mancanza di un EOL finale. Non c'è modo che nel tuo caso l'avviso sia stato lanciato dalla funzione readTableHeader, perché quella non legge la riga finale. Quindi il tuo problema non è lo stesso di quello dell'OP.
Joris Meys

20

Il problema è facile da risolvere; è perché l'ultima riga DEVE essere vuota.

Dì, se il tuo contenuto è

line 1,
line2

cambiarlo in

line 1,
line2
(empty line here)

Oggi ho incontrato questo tipo di problema, quando stavo cercando di utilizzare R per leggere un file JSON, utilizzando il comando seguente:

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

; e lo risolvo con il mio metodo sopra.


1
utilizzando l'idraulico per ospitare un'API R ho avuto lo stesso problema. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'l'avviso è stato risolto aggiungendo una riga vuota alla fine. Non sono sicuro del perchè questo stia succedendo.
HoofarLotusX

Anch'io. Grazie.
Megadeth

14

Sei davvero sicuro di aver selezionato il file .csv e non il file .xls? Posso riprodurre l'errore solo se provo a leggere un file .xls. Se provo a leggere un file .csv o qualsiasi altro file di testo, è impossibile ricreare l'errore che ottieni.

> 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'

readTableHeadè la funzione c che fornisce l'errore. Prova a leggere nelle prime n righe (standard le prime 5) per determinare il tipo di dati. Il resto dei dati viene letto utilizzando scan(). Quindi il problema è il formato del file.

Un modo per scoprirlo è impostare la directory di lavoro sulla directory in cui si trova il file. In questo modo puoi vedere l'estensione del file che leggi. So che su Windows non è mostrato come standard, quindi potresti credere che sia csv mentre non lo è.

La prossima cosa che dovresti fare è aprire il file in Blocco note o Wordpad (o un altro editor) e verificare che il formato sia equivalente al mio file test.csv:

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

Questo file ti darà il seguente dataframe:

> 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

Il formato csv salvato da Excel separa tutte le celle con una virgola. Le celle vuote semplicemente non hanno un valore. read.table()può affrontare facilmente questo problema e riconosce perfettamente le celle vuote.


Supponendo che questo sia un ambiente Windows 7, se Kate guarda il file copiato sul desktop o all'interno della cartella, l'icona di un file .csv ha una "a", mentre un file .xlsx ha un'icona che sembra più come un foglio di lavoro. Questo è un modo rapido e visivo per determinare il tipo di file. Molto più facile da vedere se salvato sul desktop poiché le icone sono più grandi. :)
Michelle

7

Usa readLines()(con warn = FALSE) per leggere prima il file in un vettore di caratteri.

Dopodiché usa l' text =opzione per leggere il vettore in un data frame conread.table()

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

3

Mi sono reso conto che sono state fornite diverse risposte ma ancora nessuna soluzione reale.

Il motivo, come accennato in precedenza, è un "Fine riga" mancante alla fine del file CSV.

Mentre la vera correzione dovrebbe provenire da Microsoft, la soluzione è aprire il file CSV con un editor di testo e aggiungere una riga alla fine del file (ovvero premere il tasto Invio). Uso il software ATOM come un editor di testo / codice, ma praticamente tutti gli editor di testo di base andrebbero bene.

Nel frattempo, segnala il bug a Microsoft.

Domanda: Mi sembra che sia un problema di Office 2016. Qualcuno ha il problema su un PC?


2

Ho ricevuto lo stesso messaggio. La mia correzione includeva: ho eliminato tutti i fogli aggiuntivi (schede) nel file .csv, eliminato caratteri non numerici, salvato nuovamente il file come delimitato da virgole e caricato in R v 2.15.0 utilizzando il linguaggio standard:

filename <-read.csv ( "nome", intestazione = TRUE)

Come ulteriore salvaguardia, ho chiuso il software e l'ho riaperto prima di caricare il csv.


2

In varie lingue europee, poiché il carattere virgola funge da punto decimale, è necessario utilizzare invece la funzione read.csv2.


2

Ho risolto questo problema cambiando la codifica nell'argomento read.table da fileEncoding = "UTF-16" a fileEncoding = "UTF-8".


1

Il problema che stai descrivendo si è verificato per me quando ho rinominato un .xlsxas .csv.

Ciò che lo ha risolto per me è stato "Salva con nome" e quindi salvarlo di .csvnuovo come file .


1

Ho riscontrato questo problema una volta quando ho avuto una singola citazione come parte dell'intestazione. Quando l'ho rimosso (cioè rinominato la rispettiva intestazione di colonna da Jimmy's dataa Jimmys data), la funzione non ha restituito alcun avviso.


1

Per risolvere questo problema tramite R stesso, ho appena usato read.xlsx(..)invece di un file read.csv(). Funziona come un fascino !! Non devi nemmeno rinominare. Rinominare un xlsx in csv non è una soluzione praticabile.


#Digvijay_Sawant, non sono sicuro di cosa intendi con il tuo ultimo commento, ma a differenza di ogni altra soluzione qui (le ho provate quasi tutte: esasperante!), La tua è stata l'unica che ha funzionato.
W Barker

1
@WBarker Nella domanda originale l'autore ha salvato l'Excel in un csv e poi ha provato a leggerlo. Ebbene, la conversione di un Excel in CSV potrebbe cambiare cose come i formati dei dati, potrebbe verificarsi una perdita di dati, ecc. Excel potrebbe memorizzare una "fine del file" in un formato diverso da un CSV che potrebbe rendere la funzione difficile da capire dove finisce il file. Beh, non sono un esperto ma solo un pensiero :-)
Digvijay Sawant

0

Apri il file in text wrangler o notepad ++ e mostra la formattazione, ad esempio in text wrangler che mostri invisibili. In questo modo puoi vedere la nuova riga oi caratteri delle tabulazioni. Spesso Excel aggiungerà tutti i tipi di tabulazioni nei posti sbagliati e non un ultimo carattere di nuova linea, ma devi mostrare i simboli per vederlo.


0

Il mio lavoro è stato quello di aprire il csvfile in un editor di testo, rimuovere le virgole in eccesso sull'ultimo valore, quindi salvare il file. Ad esempio per il seguente file

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

Rimuovi le virgole dopo 6, quindi salva il file.


0

Ho riscontrato un problema simile, tuttavia questo sembra un avviso generico e potrebbe non essere correlato al carattere di fine riga. Nel mio caso stava dando questo errore perché il file che stavo usando conteneva caratteri cirillici, una volta sostituiti con caratteri latini l'errore è scomparso.


0

Ho provato diverse soluzioni, come l'utilizzo di un editor di testo per inserire una nuova riga e ottenere il carattere di fine riga come consigliato nella risposta in alto sopra. Nessuno di questi ha funzionato, purtroppo.

La soluzione che alla fine ha funzionato per me è stata molto semplice: ho copiato e incollato il contenuto di un file CSV in un nuovo file CSV vuoto, l'ho salvato e il problema è stato risolto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.