Aviso de 'linha final incompleta' ao tentar ler um arquivo .csv em R

114

Estou tentando ler um arquivo .csv em R e usando esta fórmula:

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

Recebo esta mensagem de aviso:

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

Pensei que algumas coisas podem ter causado esse aviso, mas infelizmente não sei o suficiente sobre R para diagnosticar o problema sozinho, então pensei em postar aqui na esperança de que outra pessoa possa diagnosticar para mim!

  • o arquivo .csv era originalmente um arquivo Excel, que salvei no formato .csv
  • o arquivo compreende três colunas de dados
  • cada coluna de dados tem um comprimento diferente, ou seja, há um número diferente de valores em cada coluna
  • Eu quero comparar as médias (usando o teste t ou equivalente, dependendo da distribuição normal / não normal) de duas das colunas por vez, então, por exemplo, teste t entre os valores da coluna 1 e os valores da coluna 2, então um t- teste dos valores da coluna 1 e coluna 3, etc.

Qualquer ajuda ou sugestão seria muito apreciada!

Kate
fonte
1
@Kate: você poderia nos vincular ao próprio arquivo? Tenho algumas ideias, mas é difícil dizer qual é o problema sem ter o arquivo.
Joris Meys
Oi Joris - Não sei como fazer isso, desculpe ...
Kate
A primeira coluna tem 1045 valores, a segunda tem 623 valores e a terceira tem 871 se isso ajudar ...? Eles são todos valores numéricos em números inteiros e meio, ou seja, 23, 24,5 etc ...
Kate
1
Acho que esse é o problema, porque read.table coloca seus dados em um quadro de dados, que precisa ter comprimentos de coluna iguais.
Sir Ksilem
1
@James: Não, não é. readTableHead (a função c subjacente) lê as primeiras 5 linhas. O erro se origina aí.
Joris Meys

Respostas:

134

A mensagem indica que a última linha do arquivo não termina com um caractere de fim de linha (EOL) (alimentação de linha ( \n) ou retorno de carro + alimentação de linha ( \r\n)). A intenção original desta mensagem era avisar que o arquivo pode estar incompleto; a maioria dos arquivos de dados tem um caractere EOL como o último caractere no arquivo.

O remédio é simples:

  1. Abra o arquivo
  2. Navegue até a última linha do arquivo
  3. Coloque o cursor no final dessa linha
  4. pressione return
  5. Salve o arquivo
Hendrik Pon
fonte
2
Não é a última linha do arquivo. É o cabeçalho que ele está lendo, que são suas primeiras cinco linhas.
Joris Meys de
@JorisMeys A mensagem de erro, entretanto, refere-se à última linha do arquivo. Realizar as etapas acima realmente remove o aviso.
WorldGov
@WorldGov "linha final incompleta" é um aviso (não um erro) que pode aparecer devido a diferentes causas. No seu caso, é a falta de um EOL final. Não tem como no seu caso o aviso ter sido lançado pela função readTableHeader, porque ela não lê a linha final. Portanto, o seu problema não é o mesmo do OP.
Joris Meys
20

O problema é fácil de resolver; é porque a última linha DEVE estar vazia.

Diga, se o seu conteúdo é

line 1,
line2

mude para

line 1,
line2
(empty line here)

Hoje me deparei com esse tipo de problema, quando estava tentando usar o R ​​para ler um arquivo JSON, usando o comando abaixo:

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

; e eu resolvo isso pelo meu método acima.

Vincent Jia
fonte
1
usando encanador para hospedar uma API R Eu tive o mesmo problema. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'aviso foi resolvido adicionando uma linha vazia no final. Não sei porquê isso está acontecendo.
HoofarLotusX
O mesmo aqui. Obrigado.
Megadeth de
14

Tem certeza de que selecionou o arquivo .csv e não o arquivo .xls? Só consigo reproduzir o erro se tentar ler um arquivo .xls. Se tento ler um arquivo .csv ou qualquer outro arquivo de texto, é impossível recriar o erro que você obteve.

> 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é a função c que dá o erro. Ele tenta ler nas primeiras n linhas (padrão as 5 primeiras) para determinar o tipo de dados. O resto dos dados são lidos usando scan(). Portanto, o problema é o formato do arquivo.

Uma maneira de descobrir é definir o diretório de trabalho como o diretório onde está o arquivo. Dessa forma, você vê a extensão do arquivo que está lendo. Sei que no Windows não é mostrado como padrão, então você pode acreditar que é csv enquanto não é.

A próxima coisa que você deve fazer é abrir o arquivo no Notepad ou Wordpad (ou outro editor) e verificar se o formato é equivalente ao meu arquivo test.csv:

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

Este arquivo fornecerá o seguinte 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

O formato csv salvo pelo Excel separa todas as células com uma vírgula. As células vazias simplesmente não têm um valor. read.table()pode lidar facilmente com isso e reconhece células vazias muito bem.

Joris Meys
fonte
Presumindo que este seja um ambiente Windows 7, se Kate olhar para o arquivo copiado para a área de trabalho ou dentro da pasta, o ícone de um arquivo .csv terá um "a", enquanto um arquivo .xlsx terá um ícone que parece mais como uma planilha. Esta é uma maneira visual rápida de determinar o tipo de arquivo. Muito mais fácil de ver quando salvo na área de trabalho, pois os ícones são maiores. :)
Michelle
7

Use readLines()(com warn = FALSE) para ler o arquivo em um vetor de caracteres primeiro.

Depois disso, use a text =opção de ler o vetor em um quadro de dados comread.table()

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

Percebi que várias respostas foram fornecidas, mas nenhuma solução real ainda.

O motivo, conforme mencionado acima, é um "Fim da linha" ausente no final do arquivo CSV.

Embora a correção real deva vir da Microsoft, a solução é abrir o arquivo CSV com um editor de texto e adicionar uma linha no final do arquivo (também conhecido como pressione a tecla Enter). Eu uso o software ATOM como editor de texto / código, mas praticamente todos os editores de texto básicos serviriam.

Enquanto isso, informe o bug à Microsoft.

Pergunta: Parece-me que é um problema de escritório de 2016. Alguém tem o problema em um PC?

Nicolas Stifani
fonte
2

Recebi a mesma mensagem. Minha correção incluiu: eu excluí todas as planilhas adicionais (guias) no arquivo .csv, eliminei os caracteres não numéricos, salvei novamente o arquivo como delimitado por vírgulas e carreguei no R v 2.15.0 usando o idioma padrão:

nome do arquivo <-read.csv ("nome do arquivo", cabeçalho = TRUE)

Como uma proteção adicional, fechei o software e reabri antes de carregar o csv.

Erik
fonte
2

Em várias localidades europeias, como o caractere de vírgula serve como ponto decimal, a função read.csv2 deve ser usada.

yifan
fonte
2

Resolvi este problema com a alteração da codificação no argumento read.table de fileEncoding = "UTF-16" para fileEncoding = "UTF-8".

Dejan Pljevljakusic
fonte
1

O problema que você está descrevendo ocorreu quando mudei o nome de um .xlsxcomo .csv.

O que consertou para mim foi "Salvar como" e depois salvá-lo como um .csvnovamente.

Jase
fonte
1

Tive esse problema uma vez, quando tinha uma aspa simples como parte do cabeçalho. Quando o removi (ou seja, renomeei o respectivo cabeçalho da coluna de Jimmy's datapara Jimmys data), a função não retornou avisos.

Loukdelouk
fonte
1

Para corrigir esse problema por meio do próprio R, usei apenas em read.xlsx(..)vez de a read.csv(). Funciona como um encanto!! Você nem mesmo precisa renomear. Renomear um xlsx para csv não é uma solução viável.

Digvijay Sawant
fonte
#Digvijay_Sawant, não tenho certeza do que você quis dizer com seu último comentário, mas ao contrário de todas as outras soluções aqui (eu tentei quase todas: enlouquecedoras!), A sua foi a única que funcionou.
W Barker
1
@WBarker Na pergunta original, o autor salvou o Excel em um csv e tentou lê-lo. Bem, converter um excel em csv pode mudar coisas como formatos de dados, pode ocorrer perda de dados etc. O Excel pode armazenar um "fim de arquivo" em um formato diferente de um csv, o que pode tornar a função difícil de descobrir onde o arquivo termina. Bem, eu não sou um especialista, mas apenas um pensamento :-)
Digvijay Sawant
0

Abra o arquivo no editor de texto ou notepad ++ e mostre a formatação, por exemplo, no editor de texto você mostra invisíveis. Dessa forma, você pode ver os caracteres de nova linha ou tabulação. Freqüentemente, o Excel adicionará todos os tipos de tabulação nos lugares errados e não um caractere de última linha, mas você precisa mostrar os símbolos para ver isso.

prepagam
fonte
0

Minha solução foi que abri o csvarquivo em um editor de texto, removi as vírgulas excessivas no último valor e salvei o arquivo. Por exemplo, para o seguinte arquivo

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

Remova as vírgulas após 6 e salve o arquivo.

Chase Wright
fonte
0

Eu tive um problema semelhante, no entanto, isso parece um aviso genérico e pode não estar relacionado ao caractere de fim de linha. No meu caso estava dando esse erro porque o arquivo que eu estava usando continha caracteres cirílicos, ao substituí-los por caracteres latinos o erro desapareceu.

Imer Muhović
fonte
0

Tentei soluções diferentes, como usar um editor de texto para inserir uma nova linha e obter o caractere de fim de linha, conforme recomendado na primeira resposta acima. Nada disso funcionou, infelizmente.

A solução que finalmente funcionou para mim foi muito simples: copiei e colei o conteúdo de um arquivo CSV em um novo arquivo CSV em branco, salvei-o e o problema desapareceu.

Rens
fonte