2012-07-26 3 views
11

처음으로 포스터를 작성 했으므로 필자는 필요한 도움을 가능한 한 분명히하려고 노력할 것입니다. 저는 R에 상당히 익숙하지 않습니다. 이것이 제 첫 번째 독립적 인 프로그래밍 경험입니다.큰 비정상적인 파일 가져 오기 R

재고 틱 데이터는 약 2.5 년 동안 매일 매일 자체 파일이 있습니다. 파일은 .txt이고 대략 2 천만 ~ 3 천만 행으로 구성되어 있으며 각각 평균 ​​360mb라고 생각합니다. 한 번에 한 파일 씩 작업하고 있습니다. 이 파일들에 포함 된 모든 데이터가 필요하지는 않으며, 파일을 최소화하기 위해 프로그래밍을 사용할 수 있기를 희망했습니다.

이제 내 문제는 적절한 코드를 작성하는 데 어려움을 겪고 있기 때문에 R이 필요한 것을 이해하고 있기 때문입니다.

먼저 데이터의 일부를 보여 주므로 형식화 아이디어를 얻을 수 있습니다.

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 

데이터의 또 다른 싹둑는 :

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

그래서 당신이 볼 수있는 각 라인은 문자로 시작합니다. 각 글자는 줄의 의미를 나타냅니다. 예를 들어, R은 주문 서적 디렉토리 메시지를 의미하고, M은 마지막 초 후에 밀리 초를 의미하고, H은 주식 거래 행동 메시지를 의미합니다. 총 14 개의 다른 글자가 사용되었습니다.

나는 데이터를 R로 가져 오기 위해 readLines 함수를 사용했다. 그러나 데이터로 작업 할 때 R이 처리하는 데 오랜 시간이 걸리는 것으로 보입니다.

이제 첫 번째 문자가 R이고 오프셋 1에서 4까지의 코드가 시장 세그먼트 식별자 (Market Segment Identifier) ​​등을 의미하는 If 함수를 작성하고 싶습니다. 보다 체계적인 방식으로 데이터를 전송할 수 있습니다.

이러한 데이터를 가져 오는 가장 좋은 방법은 무엇이며 구조의 일부 양식을 만드는 것입니다. 예를 들어 한 번에 한 주식을 분석하기 위해 데이터 라인의 고유 ID 정보를 사용하십시오.

답변

1

당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

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

그리고 data.frame의 각 유형에 값을 추가 할 다른 기능에 의해 cat()를 교체합니다. 함수 f_A()의 패턴을 사용하여 테이블 구조에 대해 다른 함수와 동일한 것을 구성하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 전체 데이터에 대해서만 행을 나눌 수있었습니다.다음 코드를 사용했습니다. 코드 starts = c (1,16,30,38,46,50,54) ends = c (14,28,35,43,47,50,55) ldata = 0 (길이, 데이터) x = 부분 문자열 (시작, lstarts)' 이 코드를 각 초기 값에 할당 할 수 있습니까? 나는 각 편지 다음에 그것을 써 보려고 노력했다. 그러나 그것은 일하는 것처럼 보이지 않는다. 의견을 보내 주셔서 감사합니다 – Morten

0

readLines() 명령을 정규식과 결합 할 수 있습니다. 정규 표현식에 대한 자세한 정보를 얻으려면, 그래서 당신은 그것이 무엇을 의미하는지 각 라인을 확인, 모든 라인을 통해 이동 한 다음 처리 또는 라인의 내용을 저장할 수 있습니다 grep()

> ?grep 

의 R 도움말 사이트를 보면 그러나 당신은 좋아한다. (정규식은 한 줄로 데이터를 분할하는데도 유용합니다 ...)