2016-06-16 25 views
5

Sto leggendo i dati da un file .csv utilizzando data.table::fread su un computer Windows 10. I dati vengono letti correttamente tramite read.csv; tuttavia, quando uso fread per leggere i dati, tutte le colonne finali in ogni riga del data.table risultante termina in un \r, presumibilmente indicando un ritorno a capo. Questo fa sì che i campi numerici abbiano un tipo di dati carattere. (Invece di un valore letterale numerico 4.53, una cella di fine riga conterrà un carattere letterale 4.53\r.)Perché l'inserimento di carriage restituisce ( r) in data.table?

Perché si verifica questo errore? C'è un modo per risolvere direttamente questo attraverso la chiamata di funzione di fread?

Aggiornamento

ricevo il seguente quando il parametro verbose = TRUE viene utilizzato

Input contains no \n. Taking this to be a filename to open 
File opened, filesize is 0.000001 GB. 
Memory mapping ... ok 
Detected eol as \n only (no \r afterwards), the UNIX and Mac standard. 
Positioned on line 1 after skip or autostart 
This line is the autostart and not blank so searching up for the last non-blank ... line 1 
Detecting sep ... ',' 
Detected 7 columns. Longest stretch was from line 1 to line 13 
Starting data input on line 1 (either column names or first row of data). First 10 characters: subjectNum 
All the fields on line 1 are character fields. Treating as the column names. 
Count of eol: 13 (including 1 at the end) 
Count of sep: 72 
nrow = MIN(nsep [72]/ncol [7] -1, neol [13] - nblank [1]) = 12 
Type codes ( first 5 rows): 1131414 
Type codes: 1131414 (after applying colClasses and integer64) 
Type codes: 1131414 (after applying drop or select (if supplied) 
Allocating 7 column slots (7 - 0 dropped) 
Read 12 rows. Exactly what was estimated and allocated up front 
    0.000s ( 0%) Memory map (rerun may be quicker) 
    0.001s (33%) sep and header detection 
    0.000s ( 0%) Count rows (wc -l) 
    0.002s (67%) Column type detection (first, middle and last 5 rows) 
    0.000s ( 0%) Allocation of 12x7 result (xMB) in RAM 
    0.000s ( 0%) Reading data 
    0.000s ( 0%) Allocation for type bumps (if any), including gc time if triggered 
    0.000s ( 0%) Coercing data already read in type bumps (if any) 
    0.000s ( 0%) Changing na.strings to NA 
    0.003s  Total 
+0

Puoi provare a creare un esempio riproducibile, come 'fread (" a \ n1 \ r \ n2 \ r \ n ")' forse? In questo caso, gli indicatori di fine riga sono incoerenti, portando al comportamento che vedi. – Frank

+0

Questo porta all'errore in R. Quando leggo il file in Notepad ++, il file ha un LF solo sulla prima riga e CR LF (\ r \ n) su righe successive. Non esitate a inviare una risposta in modo che io possa accettare la vostra risposta. – Bob

+0

Sai se questo è un evento comune con i file .csv? – Bob

risposta

6

Se si dispone di un file che assomiglia x="a\n1\r\n2\r\n", quindi fread(x) darà il risultato descritto:

 a 
1: 1\r 
2: 2\r 

Ciò si verifica perché gli indicatori di fine riga sono incoerenti tra le righe.

Ho sentito parlare di questo accadendo ad altri, ma non sono sicuro da dove viene o se c'è un modo migliore per affrontarlo di "correggere" il file, probabilmente con uno strumento da riga di comando.

+0

Penso di aver visto qualcuno con questo problema nella mailing list o github, ma non ho trovato il link. – Frank

+1

Mi è successo quando ho creato i dati con python, ho codificato l'intestazione usando '\ n' in Windows. [python os.linesep] (http://stackoverflow.com/questions/1223289) – user3226167