read.csv uyarısı 'tırnak içindeki dizge içindeki EOF' dosyanın tam okunmasını engelliyor


125

Ben bir CSV dosyası (24.1 MB) Tamamen benim Ar oturumuna okuyamaz söyledi. Dosyayı bir elektronik tablo programında açtığımda 112.544 satır görebiliyorum. Onu R ile okuduğumda read.csvsadece 56.952 satır alıyorum ve bu uyarı:

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

Dosyanın tamamını R'ye şu şekilde okuyabilirim readLines:

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

Ama bunu bir tablo olarak R'ye geri alamıyorum (aracılığıyla 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

Tüm dosyayı Roturumuma almak için bu EOF mesajını (bir uyarıdan çok bir hata gibi görünen) nasıl çözebilirim veya geçici olarak çözebilirim ?

Diğer CSV dosyalarını okuma yöntemleriyle benzer sorunlarım var:

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")

İşte sessionInfo ()

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   

Yanıtlar:


197

Alıntı yapmayı devre dışı bırakmanız gerekir.

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

Sanırım bu tür çizgilerden kaynaklanıyor ("Diken" ve "Eksi" yi işaretleyin)

 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,"

Teşekkürler, bu kolay bir çözüm. Şimdi freadbu durumda çalışmaya başlamaya ne dersiniz ? Bunu tercih ederim çünkü çok daha hızlı read.csv. Ama freadbir quotetartışma kabul etmiyor gibi görünüyor ..
Ben

1
@Ben Ben de başarılı olmadan çalışmasını sağlamaya çalıştım ve belirttiğiniz gibi freadgenel olarak gömülü alıntılarla iyi oynamıyor, ancak yakında bir çözüm olacağına eminim. stackoverflow.com/questions/16094025/…
dickoa

1
Kullanırken 7.000 satırım vardı write.csv()ve 403'ü geri alıyordum read.csv(). Alıntı = "" eklemek 410 satıra kadar çıkmamı sağladı. read.table()daha iyi değil. Başka ne denenebilir merak ediyorum ...
Hack-R

2
Hack-R ile aynı sorun, quote = "" satır sayımı 30.000 artırdı ancak hala 200.000'den fazlasını kaçırıyorum.
SJDS

1
Bunu neden eklemeniz gerektiğine dair bir satır yazabilir misiniz? (Ben R öğrenmeye çalışan bir Python programcısıyım). Aksi takdirde cevap mükemmel (+1)
Bhargav Rao

10

Ben yeni bir R kullanıcısıyım ve başkalarına yardımcı olması durumunda bunu göndereceğimi düşündüm. Birkaç İspanyolca karakter içeren bir metin dosyasından (virgülle ayrılmış) veri okumaya çalışıyordum ve anlamam sonsuza kadar sürdü. UTF-8 kodlamasını kullanmam gerektiğini, başlık arg öğesini TRUE olarak ayarlamam gerektiğini ve sep arguemnt'i "," olarak ayarlamam gerektiğini biliyordum, ancak yine de takılmalarım var. Bu yazıyı okuduktan sonra , doldurma argümanını TRUE olarak ayarlamayı denedim, ancak daha sonra yukarıdaki ile aynı şekilde düzeltebildiğim aynı "alıntı dizesi içinde EOF" yi aldım. Başarılı read.table şuna benziyor:

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

Sonuçta İspanyolca karakterler ve başlangıçta sahip olduğum aynı boyutlar var, bu yüzden buna başarı diyorum! Hepinize teşekkürler!


6

R yardım bölümünde, yukarıda belirtildiği gibi, sadece aşağıdakileri ekleyerek alıntı yapmayı tamamen devre dışı bırakarak:

    quote = "" 

read.csv () dosyası benim için çalıştı.

"Alıntılanan dize içinde EOF" hatası şu şekilde ortaya çıktı:

    > 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

Ve okunan dosyada 6.619 satır eksikti. Ancak alıntı yapmayı devre dışı bırakarak

    > 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

Hatasız çalıştı ve tüm satırlar başarıyla okundu.


4
Daha önceki bir cevabı tekrarlıyorsunuz ve ardından kod bloğunun içine gereksiz iki yan yana çift yıldız ekleyerek yardımcı programını sakatlıyorsunuz.
IRTFM

3

Ayrıca bu sorunla karşılaştım ve aşağıdakileri kullanarak benzer bir EOF hatasını çözmeyi başardım:

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

Ayırıcı parametresinin daha genel olarak tanımlandığına dikkat edin read.table().


2
Merhaba, bu benim için çalışmıyor ... Bir hata aldım read.table (". Csv",: sütun adlarından daha fazla sütun - atlama (atlama = 6) düzgün çalışmıyor gibi görünüyor ...
maycca

3

Aslında, read.csv()metin içerikli bir dosyayı okumak için kullanmak iyi bir fikir değildir, alıntıyı ayarlandığı gibi devre dışı bırakınquote="" sadece geçici bir çözüm olduğundan, yalnızca Ayrı tırnak işaretleriyle çalıştı. Bazı özel karakterler gibi uyarıya neden olan başka nedenler de vardır.

Kalıcı çözüm (kullanmak read.csv()), bu özel karakterlerin ne olduğunu bulmak ve onları ortadan kaldırmak için düzenli bir ifade kullanmak bir fikirdir.

Hiç paketi kurmayı ve dosyayı okumak için {data.table}kullanmayı düşündünüz mü? fread()çok daha hızlıdır ve bu EOF uyarısıyla sizi rahatsız etmez. Yüklediği dosyanın data.table nesnesi olarak depolanacağını, ancak data.frame nesnesi olarak depolanmayacağını unutmayın. Data.table sınıfının birçok iyi özelliği vardır, ancak yine de as.data.frame()gerekirse kullanarak onu dönüştürebilirsiniz .


2

Benzer bir sorunla karşılaştım: EOF -warning ve verilerin yalnızca bir kısmı read.csv () ile yükleniyordu. Tırnak işaretlerini = "" denedim, ancak yalnızca EOF uyarısını kaldırdı.

Ancak yüklenmeyen ilk satıra baktığımda, hücrelerden birinde özel bir karakter, bir ok → (onaltılık değer 0x1A) olduğunu buldum. Oku sildikten sonra verilerin normal şekilde yüklenmesini sağladım.


1
aynı sorun, bunu herhangi bir manuel müdahale olmadan çözmenin başka bir yolu var mı?
Mohit

2

Bende de benzer bir sorun vardı. Ancak benim durumumda, sorunun nedeni, bazı metin değerleri içinde kesme işaretlerinin (yani tek tırnak işaretleri) bulunmasıydı. Bu özellikle Fransızca metinler dahil verilerle çalışırken sık görülür, örneğin «L'autre jour».

Dolayısıyla, çözüm basitçe teklif bağımsız değişkeninin varsayılan ayarını «'» sembolünü dışlayacak şekilde ayarlamaktı ve böylece tırnak = "\" " (yani yalnızca çift ​​tırnak işareti ) kullanarak her şey yolunda gitti.

Umarım bu bazılarınıza yardımcı olabilir. Şerefe.


0

Readr paketi bu sorunu çözecektir.

install.packages('readr')
library(readr)
readr::read_csv('yourfile.csv')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.