read.csv cảnh báo 'EOF trong chuỗi được trích dẫn' ngăn việc đọc hoàn toàn tệp


125

Tôi có tệp CSV (24,1 MB) mà tôi không thể đọc đầy đủ vào phiên R của mình. Khi tôi mở tệp trong chương trình bảng tính, tôi có thể thấy 112.544 hàng. Khi tôi đọc nó vào R với read.csvtôi chỉ nhận được 56.952 hàng và cảnh báo này:

cit <- read.csv("citations.CSV", row.names = NULL, 
                comment.char = "", header = TRUE, 
                stringsAsFactors = FALSE,  
                colClasses= "character", encoding= "utf-8")

Warning message:
In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  EOF within quoted string

Tôi có thể đọc toàn bộ tập tin vào R với readLines:

rl <- readLines(file("citations.CSV", encoding = "utf-8"))
length(rl)
[1] 112545

Nhưng tôi không thể lấy lại cái này thành R dưới dạng bảng (thông qua read.csv):

write.table(rl, "rl.txt", quote = FALSE, row.names = FALSE)
rl_in <- read.csv("rl.txt", skip = 1, row.names = NULL)

Warning message:
In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  EOF within quoted string

Làm cách nào tôi có thể giải quyết hoặc khắc phục thông báo EOF này (dường như có nhiều lỗi hơn là cảnh báo) để đưa toàn bộ tệp vào Rphiên của tôi ?

Tôi gặp vấn đề tương tự với các phương pháp đọc tệp CSV khác:

require(sqldf)
cit_sql <- read.csv.sql("citations.CSV", sql = "select * from file")
require(data.table)
cit_dt <- fread("citations.CSV")
require(ff)
cit_ff <- read.csv.ffdf(file="citations.CSV")

Đây là sessionInfo của tôi ()

R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] tools     tcltk     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ff_2.2-11             bit_1.1-10            data.table_1.8.8      sqldf_0.4-6.4        
 [5] RSQLite.extfuns_0.0.1 RSQLite_0.11.4        chron_2.3-43          gsubfn_0.6-5         
 [9] proto_0.3-10          DBI_0.2-7   

Câu trả lời:


197

Bạn cần phải vô hiệu hóa trích dẫn.

cit <- read.csv("citations.CSV", quote = "", 
                 row.names = NULL, 
                 stringsAsFactors = FALSE)

str(cit)
## 'data.frame':    112543 obs. of  13 variables:
##  $ row.names    : chr  "10.2307/675394" "10.2307/30007362" "10.2307/4254931" "10.2307/20537934" ...
##  $ id           : chr  "10.2307/675394\t" "10.2307/30007362\t" "10.2307/4254931\t" "10.2307/20537934\t" ...
##  $ doi          : chr  "Archaeological Inference and Inductive Confirmation\t" "Sound and Sense in Cath Almaine\t" "Oak Galls Preserved by the Eruption of Mount Vesuvius in A.D. 79_ and Their Probable Use\t" "The Arts Four Thousand Years Ago\t" ...
##  $ title        : chr  "Bruce D. Smith\t" "Tomás Ó Cathasaigh\t" "Hiram G. Larew\t" "\t" ...
##  $ author       : chr  "American Anthropologist\t" "Ériu\t" "Economic Botany\t" "The Illustrated Magazine of Art\t" ...
##  $ journaltitle : chr  "79\t" "54\t" "41\t" "1\t" ...
##  $ volume       : chr  "3\t" "\t" "1\t" "3\t" ...
##  $ issue        : chr  "1977-09-01T00:00:00Z\t" "2004-01-01T00:00:00Z\t" "1987-01-01T00:00:00Z\t" "1853-01-01T00:00:00Z\t" ...
##  $ pubdate      : chr  "pp. 598-617\t" "pp. 41-47\t" "pp. 33-40\t" "pp. 171-172\t" ...
##  $ pagerange    : chr  "American Anthropological Association\tWiley\t" "Royal Irish Academy\t" "New York Botanical Garden Press\tSpringer\t" "\t" ...
##  $ publisher    : chr  "fla\t" "fla\t" "fla\t" "fla\t" ...
##  $ type         : logi  NA NA NA NA NA NA ...
##  $ reviewed.work: logi  NA NA NA NA NA NA ...

Tôi nghĩ là do loại đường này (kiểm tra "Thorn" và "Minus")

 readLines("citations.CSV")[82]
[1] "10.2307/3642839,10.2307/3642839\t,\"Thorn\" and \"Minus\" in Hieroglyphic Luvian Orthography\t,H. Craig Melchert\t,Anatolian Studies\t,38\t,\t,1988-01-01T00:00:00Z\t,pp. 29-42\t,British Institute at Ankara\t,fla\t,\t,"

Cảm ơn, đó là một sửa chữa dễ dàng. Bây giờ bạn nghĩ gì về việc freadlàm việc trong tình huống này? Tôi thích điều đó bởi vì nó nhanh hơn nhiều read.csv. Nhưng freaddường như không có quotetranh luận ..
Ben

1
@Ben Tôi đã cố gắng làm cho nó hoạt động quá thành công mà không thành công và như bạn đã chỉ ra là freadkhông chơi tốt với trích dẫn được nhúng nói chung, nhưng tôi chắc chắn sẽ có một cách giải quyết sớm. stackoverflow.com/questions/16094025/ từ
Dickoa

1
Tôi đã có 7.000 hàng khi tôi sử dụng write.csv()và nhận lại 403 read.csv(). Thêm quote = "" đã cho tôi tới 410 hàng. read.table()không tốt hơn Tôi tự hỏi những gì khác có thể được thử ...
Hack-R

2
Vấn đề tương tự như Hack-R, thêm quote = "" đã tăng số lượng hàng của tôi thêm 30.000 nhưng tôi vẫn thiếu hơn 200.000.
SJDS

1
Bạn có thể vui lòng viết một dòng về lý do tại sao bạn cần thêm nó. (Tôi là một lập trình viên Python đang cố gắng học R). Nếu không, câu trả lời là hoàn hảo (+1)
Bhargav Rao

10

Tôi là người dùng R mới và nghĩ rằng tôi sẽ đăng bài này trong trường hợp nó giúp được bất kỳ ai khác. Tôi đã cố đọc dữ liệu từ một tệp văn bản (được phân tách bằng dấu phẩy) bao gồm một vài ký tự tiếng Tây Ban Nha và tôi phải mất mãi mãi để tìm ra nó. Tôi biết rằng tôi cần sử dụng mã hóa UTF-8, đặt tiêu đề arg thành TRUE và rằng tôi cần đặt sep arntemnt thành ",", nhưng sau đó tôi vẫn bị treo máy. Sau khi đọc bài đăng này, tôi đã thử đặt fill arg thành TRUE, nhưng sau đó nhận được cùng một "EOF trong chuỗi trích dẫn" mà tôi có thể sửa theo cách tương tự như trên. Readable thành công của tôi trông như thế này:

target <- read.table("target2.txt", fill=TRUE, header=TRUE, quote="", sep=",", encoding="UTF-8")

Kết quả có các ký tự tiếng Tây Ban Nha và cùng một độ mờ mà tôi đã có ban đầu, vì vậy tôi gọi đó là một thành công! Cảm ơn tất cả!


6

Trong phần trợ giúp R, như đã chỉ ra ở trên, chỉ cần vô hiệu hóa trích dẫn hoàn toàn, chỉ bằng cách thêm:

    quote = "" 

để read.csv () làm việc cho tôi.

Lỗi, "EOF trong chuỗi trích dẫn", xảy ra với:

    > iproscan.53A.neg     = read.csv("interproscan.53A.neg.n.csv",
    +                        colClasses=c(pb.id      = "character",
    +                                     genLoc     = "character",
    +                                     icode      = "character",
    +                                     length     = "character",
    +                                     proteinDB  = "character",
    +                                     protein.id = "character",
    +                                     prot.desc  = "character",
    +                                     start      = "character",
    +                                     end        = "character",
    +                                     evalue     = "character",
    +                                     tchar      = "character",
    +                                     date       = "character",
    +                                     ipro.id    = "character",
    +                                     prot.name  = "character",
    +                                     go.cat     = "character",
    +                                     reactome.id= "character"),
    +                                     as.is=T,header=F)
    Warning message:
    In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
      EOF within quoted string
    > dim(iproscan.53A.neg)
    [1] 69383    16

Và tập tin đã đọc bị thiếu 6.619 dòng. Nhưng bằng cách vô hiệu hóa trích dẫn

    > iproscan.53A.neg     = read.csv("interproscan.53A.neg.n.csv",
    +                        colClasses=c(pb.id      = "character",
    +                                     genLoc     = "character",
    +                                     icode      = "character",
    +                                     length     = "character",
    +                                     proteinDB  = "character",
    +                                     protein.id = "character",
    +                                     prot.desc  = "character",
    +                                     start      = "character",
    +                                     end        = "character",
    +                                     evalue     = "character",
    +                                     tchar      = "character",
    +                                     date       = "character",
    +                                     ipro.id    = "character",
    +                                     prot.name  = "character",
    +                                     go.cat     = "character",
    +                                     reactome.id= "character"),
    +                                     as.is=T,header=F,**quote=""**)    
    > 
    > dim(iproscan.53A.neg)
    [1] 76002    16

Làm việc không có lỗi và tất cả các dòng đã được đọc thành công.


4
Bạn đang lặp lại một câu trả lời trước đó và sau đó làm tê liệt tiện ích của nó bằng cách thêm các dấu sao đôi không cần thiết bên trong khối mã.
IRTFM

3

Tôi cũng gặp phải vấn đề này và đã có thể khắc phục lỗi EOF tương tự bằng cách sử dụng:

read.table("....csv", sep=",", ...)

Lưu ý rằng tham số phân tách được xác định trong phạm vi tổng quát hơn read.table().


2
Xin chào, điều này không hiệu quả với tôi ... Tôi đã gặp lỗi Lỗi trong read.table (". Csv" ,: nhiều cột hơn tên cột - có vẻ như bỏ qua (Skip = 6) không hoạt động chính xác ...
maycca

3

Trên thực tế, sử dụng read.csv()để đọc một tệp có nội dung văn bản không phải là một ý tưởng tốt, vô hiệu hóa trích dẫn vì bộ quote=""chỉ là một giải pháp tạm thời, nó chỉ hoạt động với các dấu ngoặc kép riêng biệt. Có những lý do khác sẽ gây ra cảnh báo, chẳng hạn như một số nhân vật đặc biệt.

Giải pháp vĩnh viễn (sử dụng read.csv()), tìm ra những ký tự đặc biệt đó là gì và sử dụng biểu thức chính quy để loại bỏ chúng là một ý tưởng.

Bạn đã bao giờ nghĩ đến việc cài đặt gói {data.table}và sử dụng fread()để đọc tệp. nó nhanh hơn nhiều và sẽ không làm phiền bạn với cảnh báo EOF này. Lưu ý rằng tệp mà nó tải nó sẽ được lưu trữ dưới dạng đối tượng data.table nhưng không phải là đối tượng data.frame. Lớp data.table có nhiều tính năng tốt, nhưng dù sao, bạn có thể chuyển đổi nó bằng cách sử dụng as.data.frame()nếu cần.


2

Tôi gặp vấn đề tương tự: nhận biết EOF và chỉ một phần dữ liệu được tải với read.csv (). Tôi đã thử dấu ngoặc kép = "", nhưng nó chỉ loại bỏ EOF -warning.

Nhưng nhìn vào hàng đầu tiên không tải, tôi thấy rằng có một ký tự đặc biệt, một mũi tên → (giá trị thập lục phân 0x1A) trong một trong các ô. Sau khi xóa mũi tên, tôi nhận được dữ liệu để tải bình thường.


1
cùng một vấn đề, có cách nào khác để giải quyết vấn đề này mà không cần bất kỳ sự can thiệp thủ công nào không?
Mohit

2

Tôi cũng có vấn đề tương tự. Nhưng trong trường hợp của tôi, nguyên nhân của vấn đề là do sự hiện diện của dấu nháy đơn (tức là dấu ngoặc kép đơn) trong một số giá trị văn bản. Điều này đặc biệt thường xuyên khi làm việc với dữ liệu bao gồm các văn bản bằng tiếng Pháp, ví dụ «L'autre jour».

Vì vậy, giải pháp đơn giản là điều chỉnh cài đặt mặc định của đối số trích dẫn để loại trừ ký hiệu «'», và do đó, sử dụng quote = "\" " (tức là chỉ dấu ngoặc kép ), mọi thứ đều hoạt động tốt.

Tôi hy vọng điều đó có thể giúp một số bạn. Chúc mừng.


0

Các readr gói sẽ khắc phục vấn đề này.

install.packages('readr')
library(readr)
readr::read_csv('yourfile.csv')
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.