peringatan read.csv 'EOF dalam string yang dikutip' mencegah pembacaan file yang lengkap

125

Saya memiliki file CSV (24.1 MB) yang tidak dapat saya baca sepenuhnya di sesi R. Ketika saya membuka file dalam program spreadsheet saya bisa melihat 112.544 baris. Ketika saya membacanya menjadi R dengan read.csvsaya hanya mendapatkan 56.952 baris dan peringatan ini:

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

Saya dapat membaca seluruh file menjadi R dengan readLines:

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

Tapi saya tidak bisa mendapatkan ini kembali ke R sebagai tabel (via 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

Bagaimana saya bisa menyelesaikan atau menyelesaikan pesan EOF ini (yang tampaknya lebih merupakan kesalahan daripada peringatan) untuk memasukkan seluruh file ke dalam Rsesi saya ?

Saya memiliki masalah yang sama dengan metode lain membaca file CSV:

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

Inilah sesi saya Info ()

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   
Ben
sumber

Jawaban:

197

Anda harus menonaktifkan penawaran.

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

Saya pikir ini karena jenis garis (centang "Duri" dan "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,"
dickoa
sumber
Terima kasih, itu perbaikan yang mudah. Sekarang apa yang Anda pikirkan tentang freadbekerja dalam situasi ini? Saya lebih suka itu karena jauh lebih cepat daripada read.csv. Tapi freadsepertinya tidak mengambil quoteargumen ..
Ben
1
@Ben Saya mencoba membuatnya bekerja tanpa hasil dan seperti yang Anda tunjukkan freadtidak bermain bagus dengan kutipan yang tertanam secara umum, tapi saya yakin akan segera ada solusinya. stackoverflow.com/questions/16094025/…
dickoa
1
Saya memiliki 7.000 baris ketika saya digunakan write.csv()dan mendapatkan kembali dengan 403 read.csv(). Menambahkan kutipan = "" memberi saya hingga 410 baris. read.table()tidak lebih baik. Saya ingin tahu apa lagi yang bisa dicoba ...
Hack-R
2
Masalah yang sama seperti Hack-R, menambahkan kutipan = "" meningkatkan jumlah baris saya sebesar 30.000 tapi saya masih kehilangan lebih dari 200.000.
SJDS
1
Bisakah Anda menulis baris mengapa Anda perlu menambahkan itu. (Saya seorang programmer Python yang mencoba belajar R). Kalau tidak, jawabannya sempurna (+1)
Bhargav Rao
10

Saya pengguna R ish baru dan berpikir saya akan memposting ini jika itu membantu orang lain. Saya mencoba membaca dalam data dari file teks (dipisahkan dengan koma) yang mencakup beberapa karakter Spanyol dan butuh selamanya untuk mengetahuinya. Saya tahu saya perlu menggunakan pengkodean UTF-8, mengatur argumen header ke TRUE, dan bahwa saya perlu mengatur argumen sep untuk ",", tapi kemudian saya masih mendapat hang up. Setelah membaca posting ini saya mencoba mengatur fill arg ke TRUE, tetapi kemudian mendapatkan "EOF dalam string yang dikutip" yang sama yang saya dapat perbaiki dengan cara yang sama seperti di atas. Read.table saya yang sukses terlihat seperti ini:

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

Hasilnya memiliki karakter bahasa Spanyol dan redup yang sama dengan yang saya miliki pada awalnya, jadi saya menyebutnya sukses! Terima kasih semuanya!

mjd876
sumber
6

Di bagian bantuan R, seperti yang ditunjukkan di atas, cukup nonaktifkan mengutip sama sekali, dengan hanya menambahkan:

    quote = "" 

ke read.csv () bekerja untuk saya.

Kesalahan, "EOF dalam string yang dikutip", terjadi dengan:

    > 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

Dan file yang dibaca hilang 6.619 baris. Tetapi dengan menonaktifkan kutipan

    > 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

Bekerja tanpa kesalahan dan semua baris berhasil dibaca.

Anne Deslattes Mays
sumber
4
Anda mengulangi jawaban sebelumnya dan kemudian melumpuhkan utilitasnya dengan menambahkan tanda bintang ganda yang tidak perlu di dalam blok kode.
IRTFM
3

Saya juga mengalami masalah ini, dan dapat mengatasi kesalahan EOF serupa menggunakan:

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

Perhatikan bahwa parameter pemisah didefinisikan dalam yang lebih umum read.table().

Tony T
sumber
2
Hai, ini tidak berfungsi untuk saya ... Saya mendapat pesan Galat di read.table (". Csv",: lebih banyak kolom daripada nama kolom - sepertinya melompati (lewati = 6) tidak berfungsi dengan benar ...
maycca
3

Sebenarnya, menggunakan read.csv()untuk membaca file dengan konten teks bukan ide yang baik, menonaktifkan kutipan karena quote=""hanya menetapkan solusi sementara, itu hanya bekerja dengan tanda kutip terpisah. Ada alasan lain yang akan menyebabkan peringatan, seperti beberapa karakter khusus.

Solusi permanen (menggunakan read.csv()), mencari tahu apa karakter khusus itu dan menggunakan ekspresi reguler untuk menghilangkannya adalah sebuah ide.

Pernahkah Anda berpikir untuk menginstal paket {data.table}dan menggunakannya fread()untuk membaca file. ini jauh lebih cepat dan tidak akan mengganggu Anda dengan peringatan EOF ini. Perhatikan bahwa file yang dimuatnya akan disimpan sebagai objek data.table tetapi bukan objek data.frame. Kelas data.tabel memiliki banyak fitur bagus, tetapi bagaimanapun, Anda dapat mengubahnya menggunakan as.data.frame()jika diperlukan.

mengapung
sumber
2

Saya memiliki masalah yang sama: EOF -warning dan hanya sebagian data yang dimuat dengan read.csv (). Saya mencoba tanda kutip = "", tetapi itu hanya menghapus peringatan-EOF.

Tetapi melihat baris pertama yang tidak memuat, saya menemukan bahwa ada karakter khusus, panah → (nilai heksadesimal 0x1A) di salah satu sel. Setelah menghapus panah saya mendapatkan data untuk dimuat secara normal.

ElinaJ
sumber
1
masalah yang sama, apakah ada cara lain untuk menyelesaikan ini, tanpa intervensi manual?
Mohit
2

Saya juga punya masalah serupa. Tetapi dalam kasus saya, penyebab masalah adalah karena adanya tanda kutip (yaitu tanda kutip tunggal) dalam beberapa nilai teks. Ini sering terjadi ketika bekerja dengan data termasuk teks dalam bahasa Prancis, misalnya «L'autre jour».

Jadi, solusinya adalah hanya menyesuaikan pengaturan default argumen kutipan untuk mengecualikan simbol «'», dan dengan demikian, menggunakan kutipan = "\" " (yaitu hanya tanda kutip ganda ), semuanya bekerja dengan baik.

Saya harap itu dapat membantu beberapa dari Anda. Bersulang.

marQIsoftGuy
sumber
0

The readr paket akan memperbaiki masalah ini.

install.packages('readr')
library(readr)
readr::read_csv('yourfile.csv')
vladiim
sumber