2012-07-26 22 views
11

Primer póster aquí, así que trataré de ser lo más claro posible con la ayuda que necesito. Soy bastante nuevo para R, y esta es mi primera experiencia real de programación independiente.Importar archivo inusual grande a R

Tengo datos de tick stock durante aproximadamente 2,5 años, cada día tiene su propio archivo. Los archivos son .txt y consisten en aproximadamente 20-30 millones de filas, y un promedio de 360mb cada una. Estoy trabajando un archivo a la vez por ahora. No necesito todos los datos que contienen estos archivos, y esperaba poder utilizar la programación para minimizar un poco mis archivos.

Ahora mi problema es que tengo algunas dificultades para escribir el código correcto, por lo que R entiende lo que necesito hacer.

Permítanme primero mostrar algunos de los datos para que pueda hacerse una idea del formato.

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 

Otro recorte de los datos:

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

Así como se puede ver cada línea comienza con una letra. Cada letra denota lo que significa la línea. Por ejemplo, R significa mensaje de directorio de libreta de pedidos, M significa milisegundos después del último segundo, H significa mensaje de acción de negociación de valores. Hay 14 letras diferentes utilizadas en total.

He utilizado la función readLines para importar los datos a R. Esto, sin embargo, tarda mucho tiempo para que R procese cuando quiero trabajar con los datos.

Ahora me gustaría escribir algún tipo de función If que diga si la primera letra es R y luego del desplazamiento 1 al 4 el código significa Market Segment Identifier etc., y R tiene que agregar columnas a estos para que pueda trabajar con los datos de una manera más estructurada.

¿Cuál es la mejor forma de importar dichos datos, y también crear algún tipo de estructura, es decir, utilizar información de identificación única en la línea de datos para analizar 1 stock a la vez, por ejemplo.

Respuesta

1

Usted puede intentar algo como esto:

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

y reemplazar cat() por diferentes funciones que añaden valor a cada tipo de hoja.de.datos. Use el patrón de la función f_A() para construir otras funciones y las mismas cosas para la estructura de la tabla.

+0

Gracias por su respuesta. Pude dividir las filas, pero solo para toda la información.He utilizado la siguiente codificación 'código starts = c (1,16,30,38,46,50,54) ends = c (14,28,35,43,47,50,55) ldata = longitud (datos) lstarts = length (starts) x = subcadena (data, rep (starts, rep (ldata, lstarts)), rep (ends, rep (ldata, lstarts))) matrix (x, ncol = lstarts) ' ¿Es posible asignar esta codificación a cada valor inicial? Intenté escribirlo después de cada carta, pero parece que no funciona. Gracias por la respuesta – Morten

0

Puede combinar su comando readLines() con expresiones regulares. Para obtener más información acerca de las expresiones regulares, mira la instalación de I ayuda para grep()

> ?grep 

Así que usted puede ir a través de todas las líneas, la verificación de cada línea lo que significa, y luego manejar o almacenar el contenido de la línea como sea que te guste. (Las expresiones regulares también son útiles para dividir los datos dentro de una línea ...)