Avertissement "Ligne finale incomplète" lors de la tentative de lecture d'un fichier .csv dans R

114

J'essaie de lire un fichier .csv dans R et en utilisant cette formule:

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

Je reçois ce message d'avertissement:

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

Il y a deux ou trois choses que je pensais avoir causé cet avertissement, mais malheureusement, je ne sais pas assez sur R pour diagnostiquer moi-même le problème, alors j'ai pensé publier ici dans l'espoir que quelqu'un d'autre puisse le diagnostiquer pour moi!

  • le fichier .csv était à l'origine un fichier Excel, que j'ai enregistré au format .csv
  • le fichier comprend trois colonnes de données
  • chaque colonne de données a une longueur différente, c'est-à-dire qu'il y a un nombre différent de valeurs dans chaque colonne
  • Je veux comparer les moyennes (en utilisant un test t ou équivalent en fonction de la distribution normale / non normale) de deux des colonnes à la fois, donc par exemple, test t entre les valeurs de la colonne 1 et les valeurs de la colonne 2, puis un t- test des valeurs de la colonne 1 et de la colonne 3, etc.

Toute aide ou suggestion serait sérieusement appréciée!

Kate
la source
1
@Kate: pourriez-vous nous lier au fichier lui-même? J'ai quelques idées, mais il est difficile de dire de quel problème il s'agit sans avoir le dossier.
Joris Meys
Salut Joris - Je ne sais pas comment faire ça, désolé ...
Kate
La première colonne a 1045 valeurs, la seconde 623 valeurs et la troisième 871 si cela aide ...? Ce sont toutes des valeurs numériques en nombres entiers et demi, c'est-à-dire 23, 24,5 etc ...
Kate
1
Je pense que c'est le problème, car read.table met vos données dans un bloc de données, qui doit avoir des longueurs de colonne égales.
Sir Ksilem
1
@James: Non, ce n'est pas le cas. readTableHead (la fonction c sous-jacente) lit les 5 premières lignes. L'erreur vient de là.
Joris Meys

Réponses:

134

Le message indique que la dernière ligne du fichier ne se termine pas par un caractère de fin de ligne (EOL) (saut de ligne ( \n) ou retour chariot + saut de ligne ( \r\n)). L'intention initiale de ce message était de vous avertir que le fichier est peut-être incomplet; la plupart des fichiers de données ont un caractère EOL comme tout dernier caractère du fichier.

Le remède est simple:

  1. Ouvrez le fichier
  2. Accédez à la toute dernière ligne du fichier
  3. Placez le curseur à la fin de cette ligne
  4. presse return
  5. Enregistrez le fichier
Hendrik Pon
la source
2
Ce n'est pas la dernière ligne du fichier. C'est l'en-tête qu'il lit, qui sont vos cinq premières lignes.
Joris Meys
@JorisMeys Le message d'erreur, cependant, fait référence à la dernière ligne du fichier. Suivre les étapes ci-dessus supprime en effet l'avertissement.
WorldGov
@WorldGov "ligne finale incomplète" est un avertissement (pas une erreur) qui peut apparaître en raison de différentes causes. Dans votre cas, c'est l'absence de fin de vie finale. Il n'y a aucun moyen que dans votre cas, l'avertissement ait été émis par la fonction readTableHeader, car celle-ci ne lit pas la dernière ligne. Votre problème n'est donc pas le même que celui de l'OP.
Joris Meys
20

Le problème est facile à résoudre; c'est parce que la dernière ligne DOIT être vide.

Dites, si votre contenu est

line 1,
line2

changez-le en

line 1,
line2
(empty line here)

Aujourd'hui, j'ai rencontré ce genre de problème, lorsque j'essayais d'utiliser R pour lire un fichier JSON, en utilisant la commande ci-dessous:

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

; et je le résous par ma méthode ci-dessus.

Vincent Jia
la source
1
en utilisant un plombier pour héberger une API R, j'ai eu le même problème. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'l'avertissement a été résolu en ajoutant une ligne vide à la fin. Je ne sais pas pourquoi cela se produit.
HoofarLotusX
Pareil ici. Merci.
Megadeth
14

Êtes-vous vraiment sûr d'avoir sélectionné le fichier .csv et non le fichier .xls? Je ne peux reproduire l'erreur que si j'essaye de lire dans un fichier .xls. Si j'essaie de lire un fichier .csv ou tout autre fichier texte, il est impossible de recréer l'erreur que vous obtenez.

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

readTableHeadest la fonction c qui donne l'erreur. Il essaie de lire les n premières lignes (standard les 5 premières) pour déterminer le type des données. Le reste des données est lu en utilisant scan(). Le problème est donc le format du fichier.

Une façon de le savoir est de définir le répertoire de travail sur le répertoire où se trouve le fichier. De cette façon, vous voyez l'extension du fichier que vous avez lu. Je sais que sur Windows, il n'est pas affiché en standard, donc vous pourriez croire que c'est csv alors que ce n'est pas le cas.

La prochaine chose à faire est d'ouvrir le fichier dans le Bloc-notes ou Wordpad (ou dans un autre éditeur) et de vérifier que le format est équivalent à mon fichier test.csv:

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

Ce fichier vous donnera le dataframe suivant:

> 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

Le format csv enregistré par Excel sépare toutes les cellules par une virgule. Les cellules vides n'ont tout simplement pas de valeur. read.table()peut facilement gérer cela et reconnaît très bien les cellules vides.

Joris Meys
la source
En supposant qu'il s'agit d'un environnement Windows 7, si Kate regarde le fichier copié sur le bureau ou dans le dossier, l'icône d'un fichier .csv a un "a", alors qu'un fichier .xlsx a une icône qui ressemble plus comme une feuille de calcul. Il s'agit d'un moyen visuel rapide de déterminer le type de fichier. Beaucoup plus facile à voir une fois enregistré sur le bureau car les icônes sont plus grandes. :)
Michelle
7

Utilisez readLines()(avec warn = FALSE) pour lire d'abord le fichier dans un vecteur de caractères.

Ensuite, utilisez l' text =option pour lire le vecteur dans un bloc de données avecread.table()

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

Je me suis rendu compte que plusieurs réponses avaient été apportées mais pas encore de véritable solution.

La raison, comme mentionné ci-dessus, est un "Fin de ligne" manquant à la fin du fichier CSV.

Alors que le vrai correctif devrait provenir de Microsoft, la marche à suivre consiste à ouvrir le fichier CSV avec un éditeur de texte et à ajouter une ligne à la fin du fichier (aka appuyez sur la touche Retour). J'utilise le logiciel ATOM comme éditeur de texte / code, mais pratiquement tous les éditeurs de texte de base feraient l'affaire.

En attendant, veuillez signaler le bogue à Microsoft.

Question: Il me semble que c'est un problème de bureau 2016. Quelqu'un a-t-il le problème sur un PC?

Nicolas Stifani
la source
2

J'ai reçu le même message. Mon correctif inclus: J'ai supprimé toutes les feuilles supplémentaires (onglets) dans le fichier .csv, éliminé les caractères non numériques, réenregistré le fichier comme délimité par des virgules et chargé dans R v 2.15.0 en utilisant la langue standard:

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

Comme protection supplémentaire, j'ai fermé le logiciel et rouvert avant de charger le csv.

erik
la source
2

Dans divers paramètres régionaux européens, comme la virgule sert de point décimal, la fonction read.csv2 doit être utilisée à la place.

Yifan
la source
2

J'ai résolu ce problème en changeant le codage dans l'argument read.table de fileEncoding = "UTF-16" à fileEncoding = "UTF-8".

Dejan Pljevljakusic
la source
1

Le problème que vous décrivez s'est produit pour moi lorsque j'ai renommé un fichier en tant .xlsxque .csv.

Ce qui a résolu le problème pour moi, c'était de "Enregistrer sous", puis de le sauvegarder en tant que .csvnouveau.

Jase
la source
1

J'ai eu ce problème une fois lorsque j'avais un guillemet simple dans l'en-tête. Lorsque je l'ai supprimé (c'est-à-dire renommé l'en-tête de colonne respectif de Jimmy's dataà Jimmys data), la fonction n'a renvoyé aucun avertissement.

loukdelouk
la source
1

Pour résoudre ce problème via R lui-même, je viens d'utiliser à la read.xlsx(..)place d'un fichier read.csv(). Fonctionne comme un charme !! Vous n'avez même pas besoin de renommer. Renommer un xlsx en csv n'est pas une solution viable.

Digvijay Sawant
la source
#Digvijay_Sawant, je ne sais pas ce que vous entendez par votre dernier commentaire, mais contrairement à toutes les autres solutions ici (j'ai essayé presque toutes: exaspérant!), La vôtre était la seule qui a fonctionné.
W Barker le
1
@WBarker Dans la question d'origine, l'auteur a enregistré Excel dans un fichier csv, puis a essayé de le lire. Eh bien, la conversion d'un Excel en csv pourrait changer des choses comme les formats de données, la perte de données pourrait se produire, etc. Excel pourrait stocker une "fin de fichier" dans un format différent d'un csv, ce qui pourrait rendre la fonction difficile à déterminer où se termine le fichier. Eh bien, je ne suis pas un expert mais juste une pensée :-)
Digvijay Sawant
0

Ouvrez le fichier dans text wrangler ou notepad ++ et montrez le formatage, par exemple dans text wrangler, vous montrez des invisibles. De cette façon, vous pouvez voir la nouvelle ligne ou les caractères des tabulations. Souvent, Excel ajoutera toutes sortes d'onglets aux mauvais endroits et non un dernier caractère de nouvelle ligne, mais vous devez afficher les symboles pour le voir.

prépagame
la source
0

Mon travail consiste à ouvrir le csvfichier dans un éditeur de texte, à supprimer les virgules excessives sur la dernière valeur, puis à enregistrer le fichier. Par exemple pour le fichier suivant

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

Supprimez les virgules après 6, puis enregistrez le fichier.

Chase Wright
la source
0

J'ai rencontré un problème similaire, mais cela semble être un avertissement générique, et peut en fait ne pas être lié au caractère de fin de ligne. Dans mon cas, cela donnait cette erreur car le fichier que j'utilisais contenait des caractères cyrilliques, une fois que je les ai remplacés par des caractères latins, l'erreur a disparu.

Imer Muhović
la source
0

J'ai essayé différentes solutions, telles que l'utilisation d'un éditeur de texte pour insérer une nouvelle ligne et obtenir le caractère de fin de ligne comme recommandé dans la réponse du haut ci-dessus. Aucun de ceux-ci n'a fonctionné, malheureusement.

La solution qui a finalement fonctionné pour moi était très simple: j'ai copié-collé le contenu d'un fichier CSV dans un nouveau fichier CSV vierge, je l'ai enregistré et le problème a disparu.

Rens
la source