在 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.table
或read.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 文件的主要内容,如果未能解决你的问题,请参考以下文章