>

나는 이와 같은 것을 시도했다

file_in <- file("myfile.log","r")
x <- readLines(file_in, n=-100)

그러나 여전히 기다리고 있습니다 ...

어떤 도움이라도 대단히 감사하겠습니다


  • 답변 # 1

    scan 를 사용하겠습니다  이를 위해 로그에 몇 줄이 있는지 알고있는 경우 :

    scan("foo.txt",sep="\n",what="char(0)",skip=100)
    
    

    생각해야 할 단서가 없다면, 둘 중 하나를 향해 나아가 야합니다.

    모든 것을 읽고 마지막 n 줄 (가능한 경우) 가져 가기

    scan("foo.txt",sep="\n",what=list(NULL)) 를 사용하는

     레코드가 몇 개인 지 파악하거나

    일부 알고리즘을 사용하여 파일을 살펴보고 매번 마지막 n 줄만 유지

    마지막 옵션은 다음과 같습니다 :

    ReadLastLines <- function(x,n,...){    
      con <- file(x)
      open(con)
      out <- scan(con,n,what="char(0)",sep="\n",quiet=TRUE,...)
      while(TRUE){
        tmp <- scan(con,1,what="char(0)",sep="\n",quiet=TRUE)
        if(length(tmp)==0) {close(con) ; break }
        out <- c(out[-1],tmp)
      }
      out
    }
    
    

    허용 :

    ReadLastLines("foo.txt",100)
    
    

    또는

    ReadLastLines("foo.txt",100,skip=1e+7)
    
    

    만약 1 천만 줄 이상을 알고 있다면. 이렇게하면 로그가 매우 커질 때 읽기 시간을 절약 할 수 있습니다.

    <시간>

    EDIT : 실제로 파일 크기가 주어지면 R을 사용하지 않습니다. 유닉스에서는 tail 명령을 사용할 수 있습니다. 툴킷 어딘가에 Windows 버전도 있습니다. 그래도 아직 시도하지 않았습니다.

  • 답변 # 2

    read.table 로이 작업을 수행 할 수 있습니다.   skip 를 지정하여  매개 변수. 행을 변수로 구문 분석하지 않으려면 구분 기호를 '\n' 로 지정하십시오.  @Joris Meys가 아래 지적했듯이 as.is=TRUE 도 설정했습니다.  요인 대신 문자형 벡터를 얻는 방법

    작은 예 (처음 2000 줄 건너 뛰기) :

    df <- read.table('foo.txt', sep='\n', as.is=TRUE, skip=2000)
    
    

  • 답변 # 3

    @JorisMeys가 이미 유닉스 명령 tail 를 언급했듯이  이 문제를 해결하는 가장 쉬운 방법입니다. 그러나 나는 seek 를 제안하고 싶습니다  기반 R  파일 끝에서 파일을 읽기 시작하는 솔루션 :

    tailfile <- function(file, n) {
      bufferSize <- 1024L
      size <- file.info(file)$size
      if (size < bufferSize) {
        bufferSize <- size
      }
      pos <- size - bufferSize
      text <- character()
      k <- 0L
      f <- file(file, "rb")
      on.exit(close(f))
      while(TRUE) {
        seek(f, where=pos)
        chars <- readChar(f, nchars=bufferSize)
        k <- k + length(gregexpr(pattern="\\n", text=chars)[[1L]])
        text <- paste0(text, chars)
        if (k > n || pos == 0L) {
          break
        }
        pos <- max(pos-bufferSize, 0L)
      }
      tail(strsplit(text, "\\n")[[1L]], n)
    }
    tailfile(file, n=100)
    
    

  • 이전 numerical - 문자열을 숫자로 변환하는 Javascript?
  • 다음 .net - WPF MVVM 동적 컨트롤 생성