2016-09-01 5 views
0

900 개가 넘는 큰 .CSV 파일 (2GB 이상)을 읽으려고했습니다. 내가 파일을 직접 가져올 수있는 다양한 옵션을 시도했지만 그들 중 누구도 일하지 않았다.행 방향으로 .CSV 읽기 R

지금은 .CSV 파일을 행 방식으로 읽어들이려고합니다. 다음 코드를 사용하고 내가 건너 뛰기 옵션을 사용하여 마스터 믿을수 한 번에 하나 개의 행을 추가 의미합니다 : -

data<-read.table(file_name,header=TRUE,nrows=1, skip=2,sep=",") 

내가 직면하고 문제는 내가 건너 뛰기 옵션을 사용할 때 '아무튼이다 헤더를 TRUE로 설정했지만 헤더를 읽지 않습니다.

내가 누락 된 항목이 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+1

당신은 data.table에서 fread를 시도 했습니까? –

+0

예 오류가 발생했습니다. "1183748 행의 0.0 % 읽기. 마무리 중 오류 : 9.0MB 크기의 벡터를 할당 할 수 없습니다." –

+2

모든 것이 메모리에 맞지 않으면 몇 개의 열만 읽으려고합니까? 한 번에? 메모리가 없다면 R이 시스템에 더 많은 메모리를 추가하는 것을 제외하고는 메모리에 모든 것을 보유 할 수 있도록 할 수 없습니다. – hrbrmstr

답변

3

이렇게하면 큰 CSV를 헤더가있는 청크로 나눌 수 있습니다.

#' Split a large CSV file into separate files with \code{chunk_size} records per-file 
#' 
#' @param path path to the large CSV file 
#' @param template path template for saving out the smaller files. Uses \code{sprintf}. 
#' @param chunk_size number of records per file 
#' @param locale,na,quoted_na,comment,trim_ws passed on to \code{read_csv} 
#' @examples 
#' csv_split("largefile.csv", chunk_size=10000) 
csv_split <- function(path, template="file%05d.csv", chunk_size=1000, 
         locale=default_locale(), na=c("", "NA"), quoted_na=TRUE, 
         comment="", trim_ws=TRUE) { 

    require(readr) 

    path <- path.expand(path) 

    csv_spec <- spec_csv(path) 

    skip <- 0 
    part <- 1 

    repeat { 

    df <- read_csv(path, col_names=names(csv_spec$cols), col_types=csv_spec, 
        locale=locale, na=na, quoted_na=quoted_na, comment=comment, 
        trim_ws=trim_ws, skip=skip, n_max=chunk_size) 

    if (nrow(df) == 0) break 

    cat(sprintf("Writing [%s]...\n", sprintf(template, part))) 
    write_csv(df, sprintf(template, part)) 

    part <- part + 1 
    skip <- skip + chunk_size 

    } 

} 

예 :

library(readr) 

df <- data.frame(name=sample(LETTERS, 1000000, replace=TRUE), 
       age=sample(30:100, 1000000, replace=TRUE)) 

write_csv(df, "allinone.csv") 

csv_split("allinone.csv", chunk_size=50000) 
## Writing [file00001.csv]... 
## Writing [file00002.csv]... 
## Writing [file00003.csv]... 
## Writing [file00004.csv]... 
## Writing [file00005.csv]... 
## Writing [file00006.csv]... 
## Writing [file00007.csv]... 
## Writing [file00008.csv]... 
## Writing [file00009.csv]... 
## Writing [file00010.csv]... 
## Writing [file00011.csv]... 
## Writing [file00012.csv]... 
## Writing [file00013.csv]... 
## Writing [file00014.csv]... 
## Writing [file00015.csv]... 
## Writing [file00016.csv]... 
## Writing [file00017.csv]... 
## Writing [file00018.csv]... 
## Writing [file00019.csv]... 
## Writing [file00020.csv]... 
## Writing [file00021.csv]... 

이 [수 |한다] chunk_size 갖는 첫번째 파일의 에지 경우 처리하도록 수정 - 1 기록 거기 주석되는 라인의 가능성.

실제 분할에 이것을 사용하지 않으면 최소한 열 머리글을 가져 오거나 사용하는 예제 코드가 있어야합니다.

+0

고마워요! 이것은 정말로 도움이되었습니다. –

+0

write_csv는 write.csv 여야하지만 변경 사항은 6 자 이상이어야합니다. – Mist

+0

또는 @Mist를 사용하면 answer_에서 실제 소스 코드를 _read 할 수 있으며 대신'readr :: read_csv()'를 인식 할 수 있습니다. ** 받아 들여지는 ** 대답은 틀리다 – hrbrmstr