尝试将 .csv 文件读入 R 时出现“不完整的最终行”警告

135

我正在尝试将一个 .csv 文件读入 R 中,使用以下公式:

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

我收到了以下警告消息:

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

有几件事情我认为可能导致了这个警告,但可惜的是我对R不够了解,无法自行诊断问题,所以我想在这里发布帖子,希望其他人能为我诊断!

  • .csv文件最初是Excel文件,我将其保存为.csv格式
  • 该文件包含三列数据
  • 每个数据列长度不同,即每列中值的数量不同
  • 我想一次比较两列数据的平均值(使用t-test或等效方法,具体取决于正态/非正态分布),例如,在列1值和列2值之间进行t-test,然后在列1和列3值之间进行t-test,依此类推。

任何帮助或建议都将受到严重赞赏!


1
@Kate:你能给我们提供文件的链接吗?我有一些想法,但没有文件很难确定问题所在。 - Joris Meys
嗨,Joris - 我不确定如何做到那一点,抱歉... - Kate
第一列有1045个值,第二列有623个值,第三列有871个值,是否有所帮助...?它们都是整数和半数值的数字,例如23、24.5等等... - Kate
1
我认为这就是问题所在,因为read.table将您的数据放入数据框中,而数据框需要具有相等的列长度。 - Sir Ksilem
1
@James:不是的。readTableHead(底层c函数)读取前5行。错误源自那里。 - Joris Meys
显示剩余4条评论
17个回答

157

这个提示信息表明文件的最后一行没有以行尾(End Of Line,EOL)字符结束,该字符可以是换行符(\n)或回车+换行符(\r\n)。这个提示原本的意图是警告你文件可能不完整;大多数数据文件在文件的最后一个字符处都会有一个EOL字符。

解决方法很简单:

  1. 打开该文件
  2. 导航到该文件的最后一行
  3. 将光标放置在该行末尾
  4. 按下 return
  5. 保存该文件

2
它不是文件的最后一行。他正在阅读的是头部,也就是您的前五行。 - Joris Meys
@JorisMeys,然而错误信息指的是文件的最后一行。按照上述步骤确实可以消除警告。 - WorldGov
2
@WorldGov,“不完整的最终行”是一个警告(而不是错误),可能由不同的原因引起。在您的情况下,这是由于缺少最终EOL引起的。在您的情况下,没有办法是函数readTableHeader抛出了警告,因为它不读取最终行。因此,您的问题与OP的问题不同。 - Joris Meys
有很多建议的解决方案,但只有这一个是有效的。 - exan

23

问题很容易解决;这是由于最后一行必须为空。

比如,如果你的内容是

line 1,
line2

将其改为

line 1,
line2
(empty line here)

今天我遇到了这个问题,当我试图使用R语言读取一个JSON文件时,使用如下命令:

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

最后我通过上述方法解决了这个问题。


1
使用Plumber来托管R API时,我遇到了同样的问题。通过在结尾添加一个空行,解决了“警告信息:在readLines(file)中找到不完整的最终行:'apiAnaheim.R'”的问题。不确定为什么会出现这种情况。 - HoofarLotusX
一样的情况。谢谢。 - Yes

15

你确定选中的文件是 .csv 文件而不是 .xls 文件吗?如果我尝试读入一个 .xls 文件,我只能重现这个错误。如果我尝试读入一个 .csv 文件或任何其他文本文件,就无法重新创建你所得到的错误。

> 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 是导致错误的 C 函数。它试图读取前 n 行数据(通常是前 5 行)以确定数据类型。其余数据使用 scan() 进行读取。因此,问题出在文件格式上。

找到问题的一种方法是将工作目录设置为文件所在的目录。这样,您就可以看到所读取文件的扩展名。我知道在 Windows 上默认情况下不显示扩展名,因此您可能会认为它是 csv 格式,但实际上并非如此。

接下来,您应该使用记事本、Wordpad 或其他编辑器打开文件,并检查其格式是否与我的文件 test.csv 相同:

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

此文件将给您以下数据框:
> 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

Excel保存的csv格式使用逗号分隔所有单元格。空单元格没有值。 read.table() 可以轻松处理这种情况,并能很好地识别空单元格。


假设这是一个Windows 7环境,如果Kate查看复制到桌面或文件夹内的文件,.csv文件的图标上有一个"a"字样,而.xlsx文件的图标更像一个工作表。这是一种快速确定文件类型的视觉方式。当保存到桌面时,更容易看到,因为图标更大。 :) - Michelle

14

使用readLines()(附带warn = FALSE参数)将文件首先读入字符向量中。

之后,使用text =选项将向量读入数据框中,使用read.table()

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

5

我注意到已经提供了几个答案,但是还没有真正的解决方法。

原因如上所述,是CSV文件末尾缺少“换行符”。

虽然真正的解决方法应该来自于微软,但是可以通过使用文本编辑器打开CSV文件并在文件末尾添加一行(即按回车键)来绕过此问题。我使用ATOM软件作为文本/代码编辑器,但几乎所有基本的文本编辑器都可以。

与此同时,请向微软报告此错误。

问题:我认为这是Office 2016的问题。有人在PC上遇到此问题吗?


有很多建议的解决方案,但这个是最恰当的。 - exan

4

我已经通过将read.table参数中的编码从fileEncoding = "UTF-16"更改为fileEncoding = "UTF-8"来解决了这个问题。


2
在我的情况下,这确实是最后一行。问题的解决方法是在CSV文件底部添加一个空白行。
cola,colb,colc
1,2,3
4,5,6
7,8,9

INTO

cola,colb,colc
1,2,3
4,5,6
7,8,9

仔细观察最后一行的额外空格。只需添加空白行即可解决问题。

注意

似乎R的CSV解析器正在寻找最后一个换行符作为换行分隔符。程序员更熟知这些字符,如\r\n\r


2

在一些欧洲地区,逗号被用作小数点,因此应该使用read.csv2函数。


2

我曾经遇到过这个问题,当时表头中包含了单引号。当我去掉它(即将相应的列标题从 Jimmy's data 改为 Jimmys data),函数就没有返回警告。


2
我也收到了同样的信息。我的解决方案包括:删除CSV文件中所有额外的工作表(标签),消除非数字字符,将文件重新保存为逗号分隔文件,并使用标准语言在R v 2.15.0中加载:

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

另外,为了作为一种额外的保障措施,在加载CSV之前我关闭了软件并重新打开它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接