2012-07-26 14 views
11

Locandina prima volta qui, quindi cercherò di rendermi il più chiaro possibile sull'aiuto di cui ho bisogno. Sono abbastanza nuovo per R, e questa è la mia prima vera esperienza di programmazione indipendente.Importa file insolito grande in R

Ho dati di tick di serie per circa 2,5 anni, ogni giorno ha il suo file. I file sono .txt e consistono in circa 20-30 milioni di righe e una media di 360mb ciascuna. Sto lavorando un file alla volta per ora. Non ho bisogno di tutti i dati contenuti in questi file e speravo di poter utilizzare la programmazione per ridurre al minimo i miei file.

Ora il mio problema è che sto avendo qualche difficoltà con la scrittura del codice corretto in modo che R capisca cosa ho bisogno che faccia.

Lascia che prima mostri alcuni dei dati in modo da poter avere un'idea della formattazione.

M977 
R 64266NRE1VEW107 FI0009653869 2EURXHEL 630 1 
R 64516SSA0B 80SHB SE0002798108 8SEKXSTO 40 1 
R 645730BBREEW750 FR0010734145 8EURXHEL 640 1 
R 64655OXS1C 900SWE SE0002800136 8SEKXSTO 40 1 
R 64663OXS1P 450SWE SE0002800219 8SEKXSTO 40 1 
R 64801SSIEGV LU0362355355 11EURXCSE 160 1 
M978 

Un altro elemento di cattura dei dati:

M732 
D 3547742 
A 3551497B 200000 67110 02800 
D 3550806 
D 3547743 
A 3551498S 250000 69228 09900 

Così come si può vedere ogni riga inizia con una lettera. Ogni lettera indica cosa significa la linea. Ad esempio, R significa messaggio di directory del libro degli ordini, M significa millisecondi dopo l'ultimo secondo, H significa messaggio di azione di trading azionario. Ci sono 14 diverse lettere usate in totale.

Ho usato la funzione readLines per importare i dati in R. Questo però sembra richiedere molto tempo per l'elaborazione di R quando voglio lavorare con i dati.

Ora vorrei scrivere una sorta di funzione If che dice se la prima lettera è R quindi da offset 1 a 4 il codice indica l'identificatore del segmento di mercato ecc., E sono R aggiungere colonne a questi in modo da poter lavorare con i dati in modo più strutturato.

Qual è il modo migliore di importare tali dati e anche creare una qualche forma di struttura, ad esempio utilizzare informazioni ID univoche nella riga di dati per analizzare 1 stock alla volta, ad esempio.

risposta

1

si può provare qualcosa di simile:

options(stringsAsFactors = FALSE) 

f_A <- function(line,tab_A){ 
    values <- unlist(strsplit(line," "))[2:5] 
    rbind(tab_A,list(name_1=as.character(values[1]),name_2=as.numeric(values[2]),name_3=as.numeric(values[3]),name_4=as.numeric(values[4]))) 
} 

tab_A <- data.frame(name_1=character(),name_2=numeric(),name_3=numeric(),name_4=numeric(),stringsAsFactors=F) 

for(i in readLines(con="/home/data.txt")){ 
    switch(strsplit(x=i,split="")[[1]][1],M=cat("1\n"),R=cat("2\n"),D=cat("3\n"),A=(tab_A <- f_A(i,tab_A))) 
} 

e sostituire cat() da diverse funzioni che aggiungono valore ad ogni tipo di data.frame. Usa lo schema della funzione f_A() per costruire altre funzioni e le stesse cose per la struttura della tabella.

+0

Grazie per la risposta. Sono stato in grado di suddividere le righe, ma solo per l'intero dato.Ho usato la seguente codifica 'codice starts = c (1,16,30,38,46,50,54) ends = c (14,28,35,43,47,50,55) ldata = lunghezza (dati) lstarts = length (starts) x = sottostringa (dati, rep (inizia, rep (ldata, lstart)), rep (termina, rep (ldata, lstarts))) matrice (x, ncol = lstarts) ' È possibile assegnare questa codifica a ciascun valore iniziale? Ho provato a scriverlo dopo ogni lettera, ma non sembra funzionare. Grazie per il feedback – Morten

0

È possibile combinare il comando readLines() con le espressioni regolari. Per ottenere ulteriori informazioni sulle espressioni regolari, guardate il sito R aiuto per grep()

> ?grep 

Quindi, si può passare attraverso tutte le linee, verificare la presenza di ogni linea che cosa significa, e quindi gestire o conservare il contenuto della riga come ti piace. (Le espressioni regolari sono anche utili per dividere i dati all'interno di una riga ...)