在 R 中处理大型 csv 文件

Posted

技术标签:

【中文标题】在 R 中处理大型 csv 文件【英文标题】:Working with large csv file in R 【发布时间】:2017-11-15 23:37:42 【问题描述】:

我们将不胜感激。

我使用以下代码分解了我的大型 csv 文件 (4gb),现在我正在尝试将第二、第三...部分保存到 csv 中。但是,我只能访问我的第一块数据。

我的代码有什么问题吗? 如何将我的第二个数据块保存到 csv 中?

rgfile <- 'filename.csv' 

index <- 0  

chunkSize <- 100000

con <- file(description = rgfile, open="r")

dataChunk <- read.table(con, nrows= chunkSize, header=T, fill= TRUE, sep= ",")

actualColumnNames <- names(dataChunk)

repeat 

  index <- index + 1 

  print(paste('Processing rows:', index * chunkSize)) 

  if (nrow(dataChunk) != chunkSize)
    print('Processed all files!')
    break
  

  dataChunk <- read.table(
    con, nrows = chunkSize, skip=0, header = FALSE, 
    fill=TRUE, sep = ",", col.names=actualColumnNames
  ) 

  break


【问题讨论】:

您每次循环都会覆盖dataChunk。你想写每个块吗?如果是这样,在read.table 之后应该有一个write.csv 语句。此外,skip 需要设置为您希望从每次循环开始读取的第一行。使用nrows 参数设置要读取的总行数。考虑使用来自readr 包的read_csv 或来自data.table 包的fread。两者都比read.tableread.csv 快得多。 感谢您的回复,非常感谢。你是对的,我试图将每个块写成它自己的文件。如果您不介意可以分享如何合并 write.csv 代码,因为我尝试多次保存它,但一直收到错误消息。 错误是什么? 错误:意外输入:“ dChunk = read.table(conn, nrows = chunk, skip=0, header = FALSE, fill =TRUE, sep = ",", col.names=actualColumnNames ) write.csv(dChunk, file = '" > > break Error: no loop for break/next, jumping to top level > > Error: unexpected '' in "" (请不要在 cmets 中包含大量代码或控制台输出,原因有二:(1)可能难以阅读,尤其是多行时;以及(2)希望自行解决的读者问题并不总是出现在所有 cmets 中。请编辑您的问题并在此处插入错误。) 【参考方案1】:
library(tidyverse)
library(nycflights13)

# make the problelm reproducible
rgfile <- 'flights.csv' 
write_csv(flights, rgfile)

# now, get to work

lines <- as.numeric(R.utils::countLines(rgfile))

chunk_size <- 100000

hdr <- read_csv(rgfile, n_max=2)

fnum <- 1

for (i in seq(1, lines, chunk_size)) 

  suppressMessages(
    read_csv(
      rgfile, col_names=colnames(hdr), skip=(i-1), n_max=chunk_size
    )
  ) -> x

  if (i>1) colnames(x) <- colnames(hdr)

  write_csv(x, sprintf("file%03d.csv", fnum))

  fnum <- fnum + 1


【讨论】:

以上是关于在 R 中处理大型 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

R中的流处理大型csv文件

从R中的大型.CSV导入和提取随机样本

从 R 中的大型 .CSV 导入和提取随机样本

在 R 中读取大型 csv 文件

将大型 csv 文件从 S3 读入 R

如何有效且快速地将大型 (6 Gb) .csv 文件导入 R,而不会导致 R REPL 崩溃?