簡體   English   中英

在R中逐行讀取.CSV

[英]Reading a .CSV row-wise in R

我一直在嘗試讀取具有900多個變量的大型.CSV文件(超過2GB)。 我嘗試了各種選擇直接導入文件,但沒有一個起作用。

現在,我試圖通過逐行讀取來導入.CSV文件。 這意味着我使用了skip選項並一次向主文件追加一行。我正在使用以下代碼:-

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

我面臨的問題是,即使我將header設置為TRUE,當我使用skip選項時,它也不會讀取標題。

我想念什么嗎? 任何幫助將不勝感激。

這應該使您可以將大型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個記錄的第一個文件的chunk_size以及出現注釋行的可能性。

如果您不將其用於實際拆分,則至少要有示例代碼來獲取/使用列標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM