csv 在R中使用循环将大文件拆分为较小的文件

1cosmwyk  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(116)

我有一个包含12,626,756行的csv文件,我需要将其拆分为更小的文件,以便同事可以在Excel中打开它们。我想创建一个循环,将文件拆分为符合Excel行数限制的文件,并将它们导出为CSV文件,直到循环结束(它应该生成13个文件)

#STEP 1: load data
data <- read.csv(".../Desktop/Data/file.csv", header = TRUE)

#STEP 2: count rows
totalrows <- nrow(data)

#STEP 3: determine how many splits you need 
excelrowlimit <- 1048576 - 5
filesrequired <- ceiling(totalrows/ excelrowlimit)

字符串
例如:

csvfile 1 should contain rows 1:1048571
csvfile 2 should contain rows 1048572:2097143
csvfile 3 should contain rows 2097144:3145715
csvfile 4 should contain rows 3145716:4194287
... and so on


我如何编写一个循环语句,(1)根据所需文件的数量进行拆分,(2)为每个csv导出提供不同的文件名?

dsekswqp

dsekswqp1#

这里有一个解决方案,扩展了我上面的评论。这应该比任何其他解决方案具有更小的存储器需求,因为它不需要复制原始 Dataframe 的全部或部分。

library(tidyverse)

rowCount <- 1048571
data %>% 
  mutate(Group = ceiling((row_number()) / rowCount)) %>% 
  group_by(Group) %>% 
  group_walk(
    function(.x, .y) {
      write.csv(.x, file = paste0("file", .y$Group, ".csv"))
    }
  )

字符串

brqmpdu1

brqmpdu12#

这里有一个如何实现这一点的示例,您可以使用split_at设置所需的文件大小。
在最后一部分中,你当然可以根据需要修改write_csv参数,例如:以设置路径、分隔符等。

library(tidyverse)

split_at <- 5

data.frame(x = 1:19) %>%
  mutate(group = (row_number() - 1) %/% !! split_at) %>%
  group_split(group) %>%
  map(.f = ~write_csv(.x, file = paste0('file ', unique(.x$group), '.csv')))

字符串

ekqde3dh

ekqde3dh3#

我假设每隔500行拆分数据。你可以将一列变异为lable group。然后放入for循环,根据这一列写出csv。

#STEP 1: load data
data <- read.csv(".../Desktop/Data/file.csv", header = TRUE)

# mutate a column to lable the group
data <- data %>% mutate(Group = ceiling(1:nrow(.)/500))

# write out csv by group
for(i in unique(data$Group)){
  data %>% filter(Group == i) %>% select(-Group) %>%
    write.csv(paste0("/your/path/",i,".csv"))
}

字符串

相关问题