2010-06-16 4 views
3

사용중인 소프트웨어는 다양한 줄 바꿈으로 구분 된 데이터 다음에 다양한 줄의 요약 정보가있는 로그 파일을 생성합니다. 요약 정보를 무시하고 데이터 프레임에 이러한 로그 파일의 데이터를 읽는 함수를 작성하려고합니다. 다음과 같은 기능이 작동되도록 요약 정보, 탭을 포함하지 않는다 : 탭으로 구분 된 구분 된 파일의 머리글 앞에 여분의 줄을 건너 뛰는 방법 R

read.parameters <- function(file.name, ...){ 
    lines <- scan(file.name, what="character", sep="\n") 
    first.line <- min(grep("\\t", lines)) 
    return(read.delim(file.name, skip=first.line-1, ...)) 
} 

그러나, 이러한 로그 파일은 매우 크고, 그래서 파일을 읽는 두 번 매우 느립니다. 확실히 더 좋은 방법이 있습니까?

편집은 추가 :

는 마렉은 textConnection 객체를 사용하여 제안했다. 그는이 질문에 제안하는 방법은 큰 파일에 실패,하지만 다음 작품 : 다시

read.parameters <- function(file.name, ...){ 
    conn = file(file.name, "r") 
    on.exit(close(conn)) 
    repeat{ 
    line = readLines(conn, 1) 
    if (length(grep("\\t", line))) { 
     pushBack(line, conn) 
     break}} 
    df <- read.delim(conn, ...) 
    return(df)} 

편집 : 감사 마렉 위의 기능을 더욱 개선.

+1

안전하게 연결을 닫기 위해'on.exit' 함수를 사용할 수 있습니다. 'conn = file (...)'바로 뒤에'on.exit (close (conn))'줄을 추가하십시오. 그런 다음 함수가 작업을 완료하면 (정상적으로 또는 오류가있는 경우) 연결이 닫힙니다. 그렇지 않으면'file'과'close' 사이에 오류가있을 때 연결이 열립니다. – Marek

+0

고마워, 좋은 기술. 나는 그것을 업데이트했다. –

답변

1

두 번 읽을 필요가 없습니다. 첫 번째 결과에 textConnection을 사용하십시오.

+0

오타가 수정되었습니다. textConnection 사용에 대한 제안을 보내 주셔서 감사합니다.하지만이 기능은 작동하지 않습니다. 먼저 textConnection을 만들고 나서 스캔을 실행 한 다음 pushBack을 사용하여 파일을 되감기해야한다고 생각합니다. –

+0

이상한. 나는 그것을 테스트하고 나의 가짜 데이터를 위해 일한다. 오류 메시지가 표시되거나 결과가 비어 있습니까? – Marek

+0

예 :'cat (c ("ds", "sdds", "sddfsd", "a \ tb \ tc", "1 \ t2 \ t3", "1 \ t2 \ t3"), file = "test. txt ", sep ="\ n ")'다음에'read.parameters ("test.txt ")''data.frame'을 3 cols와 2 rows로 반환합니다. – Marek

0

헤더 정보가 N 줄보다 길지 않을 수도 있습니다. N = 200, 다음 시도 :

스캔을 (..., NLINES = N)

이되지 않습니다 그런 식으로 N 라인 이상을 다시 읽어보십시오.

+0

괜찮은 접근 방법이지만 헤더 크기에 대해서는 아무 것도 보장 할 수 없습니다. 나는 파일 포인터를 사용하는 나의 기능에 상당히 만족하고있다. –

관련 문제