2014-09-05 2 views
5

큰 매개 변수 목록과 X-Y 좌표 집합으로 구성된 출력 .txt 파일 묶음이 있습니다. 모든 파일에서 이러한 좌표를 추출하여 해당 행만 벡터로 가져와야합니다.R - 특정 줄 다음에 .txt 파일의 행 읽기

impcoord<-read.table("file.txt",skip= ,nrow= ,...) 

과 같이 작동하지만 파일은 지원 매개 변수 길이가 다른 후 좌표 세트를 인쇄합니다.

운 좋게도 좌표는 항상 특정 단어가 포함 된 줄 다음에 시작됩니다.

내 질문은, 어떻게 이러한 단어 뒤에 .txt 파일을 읽는 것입니까? 그들은 다음과 같다고 가정 해 보겠습니다.

coordinatesXY 

감사합니다.

-Olli

--Edit--

혼란을 드려 죄송합니다. 다음

파일의 일부이다 :

##XYDATA= (X++(Y..Y)) 
131071 -2065 
131070 -4137 
131069 -6408 
131068 -8043 
...  ... 
...  ... 

상기 제 1 행 하나 skip이 끝나야 다음 좌표 벡터에 반입해야 할 곳. 당신이 볼 수 있듯이 X 좌표는 131071에서 시작하고 0

+1

그 파일에 더 많은 것이 있습니다. 내 게시물의 문제는'## END ='로 시작하는 라인이 좌표 라인 뒤의 라인입니까? – JeremyS

+0

입니다. 어쩌면 매개 변수 행에'nrow ='를 포함시켜야합니까? –

답변

6

1) gsubfn의 read.patternread.pattern은 특정 패턴과 일치하는 행만 읽는 데 사용할 수 있습니다. 이 예에서는 행의 시작, 선택적 공백, 하나 이상의 숫자, 하나 이상의 공백, 선택적 마이너스 뒤에 하나 이상의 숫자, 선택적 공백, 행의 끝을 매치합니다. regexp의 괄호로 묶은 부분과 일치하는 부분은 data.frame의 열로 반환됩니다. 이자가 포함 된 예제의 text = Lines은 데이터가 파일에서 오는 경우 "myfile.txt"으로 바꿀 수 있습니다. 원하는대로 패턴을 수정하십시오.

Lines <- "junk 
junk 
##XYDATA= (X++(Y..Y)) 
131071 -2065 
131070 -4137 
131069 -6408 
131068 -8043" 

library(gsubfn) 
DF <- read.pattern(text = Lines, pattern = "^ *(\\d+) +(-?\\d+) *$") 

주는 :

> DF 
     V1 V2 
1 131071 -2065 
2 131070 -4137 
3 131069 -6408 
4 131068 -8043 

2)만을 기재 R을 사용 배 다른 가능성을 판독 단순히 skip= 값 및 사용은 실제 판독을 할 수있는 두 번째로 결정하는 한번 읽을 그 값. 파일 myfile.txt에서 읽으려면 text = LinestextConnection(Lines)"myfile.txt"으로 바꿉니다.

read.table(text = Lines, 
    skip = grep("##XYDATA=", readLines(textConnection(Lines)))) 

추가 일부 개정 및 두 번째 방법을 추가했습니다.

+0

답변 해 주셔서 감사합니다. 두 번째 방법은 멋지게 작동했습니다! –

4

이 왜 그것을 즉 data.tablefread

library(data.table) 
impcoord <- fread("file.txt",skip="coordinatesXY") 

--edit--

에 대한 작업처럼 보이는에 종료 재현 가능한 예제를 제공하는 것이 좋습니다. 이 오류는 파일이 문제를 일으키는 것을 의미합니다.

skip 명령은 파일에 지정한 텍스트를 파일과 비교하여 시작할 행을 식별하므로 읽기를 시작할 행의 시작 부분에서 고유 한 문자열을 제공해야합니다. 이 함수는 다음과 같이 작동합니다 : 당신은 표시 문자열을 찾을 때

 conn<-file("file.txt",open="rt") 
    x<-TRUE 
    while (x) 
     {x<-!grepl("coordinatesXY",readLines(conn,n=1))} 
    ret<-read.table(conn,...) #insert additional parameters to read.table 
    close(conn) 

당신은 입력 파일에서 한 번에 하나의 라인을 읽고 중지 :

## some random text 
## some more random text 
## More random text 
table_heading1, table_heading2, table_heading3 ...etc 
value1, value2, value3 ... etc 
etc 

Just_The_Table <- fread("the_above_as_a_text_file.txt", skip="table_heading1", header=T) 
+0

답변 해 주셔서 감사합니다! 그러나이 접근 방식은 'skip ='에서 제공 한 값이나 지정자와 상관없이 유형'## END ='을 감지 할 때'2 행의 필드 1을 종료합니다. '오류를 반환합니다. –

+0

은 특정 파일을 소리 내며, fread 건너 뛰기가 작동하는 방식의 예를 보려면 내 대답의 편집을 참조하십시오. – JeremyS

1

가능한 방법은 다음을 수 . 그런 다음 read.table을 통해 파일을 읽습니다. 이 방법을 사용하면 전체 파일을 메모리에 저장하지 않고 필요한 파일 만 저장할 수 있습니다.

+0

답변 해 주셔서 감사합니다. –

관련 문제