Provo a caricare un file di dati di grandi dimensioni (circa 20 milioni di righe) utilizzando fread()
dal pacchetto . Alcune file stanno causando grandi problemi, tuttavia.Utilizzo di fread per leggere i dati con virgolette doppie e caratteri di escape errati
Esempio minimo:
text.csv contains:
id, text
1,"""Oops"",\""The"",""Georgia"""
fread("text.csv", sep=",")
Error in fread("text.csv", sep = ",") :
Not positioned correctly after testing format of header row. ch=','
In addition: Warning message:
In fread("text.csv", sep = ",") :
Starting data input on line 2 and discarding line 1 because it has too few or too many items to be column names or data: id, text
read.table()
opere leggermente migliori ma è troppo lento e troppo memoria inefficiente.
> read.table("text.csv", header = TRUE, sep=",")
id text
1 1 "Oops",\\"The","Georgia"
Mi rendo conto che il mio file di testo non è formattato correttamente, ma è troppo grande per essere modificato in modo pratico.
Qualsiasi aiuto molto apprezzato.
EDIT:
Un piccolo campione di record di dati effettivi:
sample1.txt, a good record:
materiale_id,dk5,description,creator,subject-phrase,title,type
125030-katalog:000000003,[78.793],Privatoptagelse. - Liveoptagelse,Frederik Lundin,,Koncert i Copenhagen Jazz House den 26.1.1995,music
> fread("sample1.txt", sep=",")
materiale_id dk5 description creator subject-phrase
1: 125030-katalog:000000003 [78.793] Privatoptagelse. - Liveoptagelse Frederik Lundin NA
title type
1: Koncert i Copenhagen Jazz House den 26.1.1995 music
sample2.txt, a good and a bad record:
materiale_id,dk5,description,creator,subject-phrase,title,type
125030-katalog:000000003,[78.793],Privatoptagelse. - Liveoptagelse,Frederik Lundin,,Koncert i Copenhagen Jazz House den 26.1.1995,music
150012-leksikon:100019,,"Databehandling vedrører rutiner og procedurer for datarepræsentation, lagring af data, overførsel af data mellem forskellige instanser eller brugere af data, beregninger eller andre operationer udført med...",,"[""Informatik"",""it"",""It, teknik og naturvidenskab"",""leksikonartikel"",""Software, programmering, internet og webkommunikation""]",it - elementer i databehandling,article
> fread("sample2.txt", sep=",")
Empty data.table (0 rows) of 11 cols: 150012-leksikon:100019,V2,Databehandling vedrører rutiner og procedurer for datarepræsentation, lagring af data, overførsel af data mellem forskellige instanser eller brugere af data, beregninger eller andre operationer udført med...,V4,[""Informatik","it"...
EDIT 2:
Aggiornamento a R versione 3.2.3 e 1.9.6 data.table . aiuta a quanto sopra, ma crea problemi con altri record:
sample3.txt, a good and a bad record:
materiale_id,dk5,description,creator,subject-phrase,title,type
125030-katalog:000236595,,,Red Tampa Solist prf,"[""Tom"",""Georgia"",""1929-1930""]","Georgia Tom, 1929-1930",music
125030-katalog:000236596,,,Jane Lucas (Solist),"[""1928-1931"",""Tom,\""The"",""Georgia"",""Accompanist""]","Georgia Tom,""The Accompanist"" (1928-1931)",music
> s3 <- fread("sample3.txt", sep=",")
Error in fread("sample3.txt", sep = ",") :
Expecting 7 cols, but line 3 contains text after processing all cols. It is very likely that this is due to one or more fields having embedded sep=',' and/or (unescaped) '\n' characters within unbalanced unescaped quotes. fread cannot handle such ambiguous cases and those lines may not have been read in as expected. Please read the section on quotes in ?fread.
EDIT 3:
l'aggiornamento alla versione di sviluppo 1.9.7 di tabelle di dati rompe fread()
del tutto:
> s3 <- fread("sample3.txt", sep=",")
Error in fread("sample3.txt", sep = ",") :
showProgress is not type integer but type 'logical'. Please report.
EDIT 4:
Sembra che il problema lem nel mio file si verifica quando i record contengono la stringa \\"
(litteraly, espressione non regolare). Apparentemente, c'è un backslash troppo grande, che causa fread()
di interpretare erroneamente una virgoletta doppia come la fine di una stringa, dove avrebbe dovuto essere presa in letargo.
miei migliori soluzioni finora è di fare questo:
m1 <- readLines("data.csv", encoding="UTF-8")
m2 <- gsub("\\\\\"", "\\\"", m1)
writeLines(m2, "data_new.csv", useBytes = TRUE)
m3 <- fread("data_new.csv", encoding="UTF-8", sep=",")
che sembra funzionare.
Non capisco questo 100%, quindi qualsiasi chiarimento è più che benvenuto.
Se è solo la riga di intestazione, è possibile saltare la 1a riga su read in. E quindi estrarla di nuovo tramite 'readLines()' e fare le regolazioni appropriate. –
Grazie, ma sono le linee dati che causano problemi occidentali –
Si consiglia di utilizzare qualcosa come [questo] (http://stackoverflow.com/questions/29499145/preventing-column-class-inference-in-fread/29499512 # 29499512), che rimuove le virgolette aggiuntive (solo la prima parte). –