2016-09-01 15 views
0

私は900個以上の変数を持つ大きな.CSVファイル(2GB +)を読み込もうとしています。ファイルを直接インポートするためのさまざまなオプションを試しましたが、どれも機能しませんでした。.CSVを行単位で読むR

今は、.CSVファイルを行単位で読み込もうとしています。次のコードを使用しています、私はスキップオプションを使用すると、マスターfile.Iに一度に1行を追加することを意味する: -

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

私が直面しています問題は、私はスキップオプションを使用する場合それはdoesnのことですヘッダーをTRUEに設定していても、ヘッダーを読み取ることはできません。

何か不足していますか?どんな助けでも本当に感謝します。

+1

あなたはdata.tableでfreadを試しましたか? –

+0

はい私はしてエラーを取得 "1183748行の0.0%を読む ラップアップ中にエラー:サイズ9.0 MBのベクトルを割り当てることができません" –

+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

関連する問題