Cảnh báo 'Dòng cuối cùng không đầy đủ' khi cố đọc tệp .csv thành R


114

Tôi đang cố đọc tệp .csv thành R và sử dụng công thức này:

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

Tôi nhận được thông báo cảnh báo này:

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

Có một số điều tôi nghĩ có thể đã gây ra cảnh báo này, nhưng rất tiếc, tôi không biết đủ về R để tự chẩn đoán vấn đề nên tôi nghĩ tôi sẽ đăng ở đây với hy vọng ai đó có thể chẩn đoán cho tôi!

  • tệp .csv ban đầu là tệp Excel, tôi đã lưu ở định dạng .csv
  • tệp bao gồm ba cột dữ liệu
  • mỗi cột dữ liệu có độ dài khác nhau, tức là có một số giá trị khác nhau trong mỗi cột
  • Tôi muốn so sánh giá trị trung bình (sử dụng t-test hoặc tương đương tùy thuộc vào phân phối chuẩn / không chuẩn) của hai trong số các cột tại một thời điểm, vì vậy, ví dụ: kiểm tra t giữa các giá trị cột 1 và giá trị cột 2, thì t- kiểm tra giá trị cột 1 và cột 3, v.v.

Bất kỳ trợ giúp hoặc đề xuất sẽ được đánh giá cao nghiêm túc!


1
@Kate: bạn có thể liên kết chúng tôi với chính tệp đó không? Tôi có một số ý tưởng, nhưng rất khó để nói vấn đề đó là gì nếu không có tệp.
Joris Meys

Xin chào Joris - Tôi không chắc làm thế nào để làm điều đó, xin lỗi ...
Kate

Cột đầu tiên có 1045 giá trị, cột thứ hai có 623 giá trị và cột thứ ba có 871 nếu điều đó giúp ...? Chúng đều là các giá trị số ở dạng số nguyên và một nửa, tức là 23, 24,5, v.v.
Kate

1
tôi nghĩ đó là vấn đề, vì read.table đặt dữ liệu của bạn trong một khung dữ liệu, khung này cần có độ dài cột bằng nhau.
Sir Ksilem

1
@James: Không, không phải đâu. readTableHead (hàm c bên dưới) đọc 5 dòng đầu tiên. Lỗi bắt nguồn từ đó.
Joris Meys

Câu trả lời:


134

Thông báo cho biết dòng cuối cùng của tệp không kết thúc bằng ký tự End Of Line (EOL) (linefeed ( \n) hoặc xuống dòng + linefeed ( \r\n)). Mục đích ban đầu của thông báo này là để cảnh báo bạn rằng tệp có thể chưa hoàn chỉnh; hầu hết các tệp dữ liệu có ký tự EOL là ký tự cuối cùng trong tệp.

Cách khắc phục rất đơn giản:

  1. Mở tập tin
  2. Điều hướng đến dòng cuối cùng của tệp
  3. Đặt con trỏ vào cuối dòng đó
  4. nhấn return
  5. Lưu các tập tin

2
Đây không phải là dòng cuối cùng của tệp. Đó là tiêu đề anh ấy đang đọc, là năm dòng đầu tiên của bạn.
Joris Meys

@JorisMeys Tuy nhiên, thông báo lỗi đề cập đến dòng cuối cùng của tệp. Thực hiện các bước trên thực sự loại bỏ cảnh báo.
WorldGov

@WorldGov "dòng cuối cùng chưa hoàn thành" là một cảnh báo (không phải lỗi) có thể bật lên do các nguyên nhân khác nhau. Trong trường hợp của bạn, đó là thiếu EOL cuối cùng. Không có cách nào mà trong trường hợp của bạn cảnh báo được ném bởi hàm readTableHeader, bởi vì hàm đó không đọc dòng cuối cùng. Do đó vấn đề của bạn không giống như vấn đề của OP.
Joris Meys

20

Vấn đề rất dễ giải quyết; đó là bởi vì dòng cuối cùng PHẢI để trống.

Giả sử, nếu nội dung của bạn là

line 1,
line2

thay đổi nó thành

line 1,
line2
(empty line here)

Hôm nay tôi đã gặp sự cố loại này, khi tôi cố gắng sử dụng R để đọc tệp JSON, bằng cách sử dụng lệnh bên dưới:

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

; và tôi giải quyết nó bằng phương pháp trên.


1
sử dụng thợ sửa ống nước để lưu trữ API R Tôi đã gặp vấn đề tương tự. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'cảnh báo đã được giải quyết bằng cách thêm một dòng trống vào cuối cùng. Không chắc chắn lý do tại sao điều này xảy ra.
HoofarLotusX

Ở đây cũng vậy. Cảm ơn.
Megadeth

14

Bạn có thực sự chắc chắn rằng bạn đã chọn tệp .csv chứ không phải tệp .xls không? Tôi chỉ có thể tạo lại lỗi nếu tôi cố đọc trong tệp .xls. Nếu tôi cố đọc trong tệp .csv hoặc bất kỳ tệp văn bản nào khác, thì không thể tạo lại lỗi bạn gặp phải.

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

readTableHeadlà hàm c đưa ra lỗi. Nó cố gắng đọc trong n dòng đầu tiên (tiêu chuẩn là 5 dòng đầu tiên) để xác định loại dữ liệu. Phần còn lại của dữ liệu được đọc bằng cách sử dụngscan() . Vì vậy, vấn đề là định dạng của tệp.

Một cách để tìm ra, là đặt thư mục làm việc thành thư mục chứa tệp. Bằng cách đó, bạn sẽ thấy phần mở rộng của tệp bạn đã đọc. Tôi biết trên Windows, nó không được hiển thị chuẩn, vì vậy bạn có thể tin rằng đó là csv trong khi nó không phải vậy.

Điều tiếp theo bạn nên làm là mở tệp trong Notepad hoặc Wordpad (hoặc một trình soạn thảo khác) và kiểm tra xem định dạng có tương đương với tệp của tôi không test.csv:

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

Tệp này sẽ cung cấp cho bạn khung dữ liệu sau:

> 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

Định dạng csv được lưu bởi excel phân tách tất cả các ô bằng dấu phẩy. Các ô trống không có giá trị. read.table()có thể dễ dàng đối phó với điều này và nhận ra các ô trống tốt.


Giả sử đây là môi trường Windows 7, nếu Kate nhìn vào tệp được sao chép vào màn hình nền hoặc bên trong thư mục, biểu tượng cho tệp .csv có "a" trên đó, trong khi tệp .xlsx có biểu tượng trông nhiều hơn giống như một trang tính. Đây là một cách trực quan nhanh chóng để xác định loại tệp. Dễ nhìn hơn nhiều khi được lưu trên màn hình vì các biểu tượng lớn hơn. :)
Michelle

7

Sử dụng readLines()(với warn = FALSE) để đọc tệp thành một vectơ ký tự trước.

Sau đó, sử dụng text =tùy chọn để đọc vectơ vào khung dữ liệu vớiread.table()

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

3

Tôi nhận ra rằng một số câu trả lời đã được cung cấp nhưng vẫn chưa có bản sửa lỗi thực sự nào.

Lý do, như đã đề cập ở trên, là thiếu "End of line" ở cuối tệp CSV.

Mặc dù Bản sửa lỗi thực sự phải đến từ Microsoft, nhưng cách thực hiện là mở tệp CSV bằng Trình soạn thảo văn bản và thêm một dòng ở cuối tệp (hay còn gọi là nhấn phím quay lại). Tôi sử dụng phần mềm ATOM làm trình soạn thảo văn bản / mã nhưng hầu như tất cả các trình soạn thảo văn bản cơ bản đều làm được.

Trong khi đó, vui lòng báo cáo lỗi cho Microsoft.

Câu hỏi: Đối với tôi, dường như đó là một vấn đề của Office 2016. Có ai gặp sự cố trên PC không?


2

Tôi nhận được cùng một tin nhắn. Bản sửa lỗi của tôi bao gồm: Tôi đã xóa tất cả các trang (tab) bổ sung trong tệp .csv, loại bỏ các ký tự không phải số, lưu tệp dưới dạng được phân tách bằng dấu phẩy và được tải trong R v 2.15.0 bằng ngôn ngữ chuẩn:

tên tệp <-read.csv ("tên tệp", header = TRUE)

Như một biện pháp bảo vệ bổ sung, tôi đã đóng phần mềm và mở lại trước khi tải csv.


2

Trong các ngôn ngữ châu Âu khác nhau, vì ký tự dấu phẩy đóng vai trò là dấu thập phân, nên hàm read.csv2 sẽ được sử dụng thay thế.


2

Tôi đã giải quyết vấn đề này bằng cách thay đổi mã hóa trong đối số read.table từ fileEncoding = "UTF-16" thành fileEncoding = "UTF-8".


1

Vấn đề mà bạn đang mô tả xảy ra đối với tôi khi tôi đổi tên .xlsxnhư .csv.

Điều đã khắc phục sự cố đối với tôi là "Lưu dưới dạng" và sau đó lưu lại dưới dạng .csv.


1

Tôi đã gặp sự cố này một lần khi tôi có một trích dẫn duy nhất như một phần của tiêu đề. Khi tôi xóa nó (tức là đổi tên tiêu đề cột tương ứng từ Jimmy's datathành Jimmys data), hàm không trả về cảnh báo nào.


1

Để khắc phục sự cố này thông qua chính R, tôi chỉ cần sử dụng read.xlsx(..)thay vì a read.csv(). Hoạt động như một sự quyến rũ !! Bạn thậm chí không phải đổi tên. Đổi tên xlsx thành csv không phải là giải pháp khả thi.


#Digvijay_Sawant, không chắc ý của bạn về nhận xét cuối cùng của bạn, nhưng không giống như mọi giải pháp khác ở đây (tôi đã thử gần như tất cả chúng: maddening!), Giải pháp của bạn là giải pháp duy nhất hoạt động.
W Barker

1
@WBarker Trong câu hỏi ban đầu, tác giả đã lưu Excel vào một tệp csv và sau đó cố gắng đọc nó. Việc chuyển đổi tốt một excel sang csv có thể làm thay đổi những thứ như định dạng dữ liệu, có thể xảy ra mất dữ liệu, v.v. Excel có thể lưu trữ "phần cuối của tệp" ở định dạng khác với csv, điều này có thể khiến hàm khó tìm ra nơi tệp kết thúc. Vâng, tôi không phải là chuyên gia mà chỉ là một suy nghĩ :-)
Digvijay Sawant

0

Mở tệp trong text wrangler hoặc notepad ++ và hiển thị định dạng, ví dụ như trong text wrangler mà bạn hiển thị ẩn. Bằng cách đó, bạn có thể thấy các ký tự dòng hoặc tab mới Thường thì excel sẽ thêm tất cả các loại tab vào sai vị trí và không phải ký tự dòng mới cuối cùng, nhưng bạn cần hiển thị các ký hiệu để thấy điều này.


0

Công việc của tôi là tôi đã mở csvtệp trong trình soạn thảo văn bản, loại bỏ các dấu phẩy thừa trên giá trị cuối cùng, sau đó lưu tệp. Ví dụ cho tệp sau

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

Bỏ dấu phẩy sau 6, sau đó lưu tệp.


0

Tôi đã gặp sự cố tương tự, tuy nhiên điều này xuất hiện với một cảnh báo chung và trên thực tế có thể không liên quan đến ký tự cuối dòng. Trong trường hợp của tôi, nó gây ra lỗi này vì tệp tôi đang sử dụng chứa các ký tự Cyrillic, khi tôi thay thế chúng bằng các ký tự latin, lỗi đã biến mất.


0

Tôi đã thử các giải pháp khác nhau, chẳng hạn như sử dụng trình soạn thảo văn bản để chèn một dòng mới và lấy ký tự End Of Line như được đề xuất trong câu trả lời hàng đầu ở trên. Thật không may, không ai trong số này hoạt động.

Các giải pháp mà cuối cùng đã làm việc đối với tôi là rất đơn giản: tôi copy-dán nội dung của một tập tin CSV vào một tập tin CSV trống mới, lưu nó, và các vấn đề đã biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.