如何用R分割竖线分隔的CSV文件并保留原格式
问题描述
我有一个以竖线(|)作为列分隔符的myfile.csv文件,需要用R将其分割为2个行数均等的CSV文件,且每个文件都保留表头行。
原文件内容如下:
userid|logindatetime|logoutdatetime|description 111|2024-02-10 08:00:00|2024-02-10 08:00:00|systemadministrator 112|2024-02-11 08:00:00|2024-02-10 08:00:05|user1 113|2024-02-12 08:00:00|2024-02-10 08:00:10|user2 114|2024-02-13 08:00:00|2024-02-10 08:00:15|user3 115|2024-02-14 08:00:00|2024-02-10 08:00:20|user4 116|2024-02-15 08:00:00|2024-02-10 08:00:25|user5 117|2024-02-16 08:00:00|2024-02-10 08:00:30|user6 118|2024-02-17 08:00:00|2024-02-10 08:00:35|user7 111|2024-02-18 08:00:00|2024-02-10 08:00:40|systemadministrator 119|2024-02-18 08:00:00|2024-02-10 08:00:45|user8
我尝试了以下代码:
library(tidyverse) rowCount <- 2 data %>% mutate(Group = ceiling((row_number()) / rowCount)) %>% group_by(Group) %>% group_walk( function(.x, .y) { write.csv(.x, file = paste0("myfile.csv", .y$Group, ".csv")) } )
但该方案无法保留竖线分隔符,反而使用逗号分隔,还为字符串添加双引号并引入行号,破坏了原文件格式。
之后我尝试修改代码添加参数,结果报错:
rowCount <- 2 data %>% mutate(Group = ceiling((row_number()) / rowCount)) %>% group_by(Group) %>% group_walk( function(.x, .y) { write.csv(.x, file = paste0("myfile.csv", .y$Group, ".csv", sep = "|", header = TRUE, quote = "", stringsAsFactors = FALSE)) } )
错误信息:
Error in file(file, ifelse(append, "a", "w")) : cannot open the connection In addition: Warning message: In file(file, ifelse(append, "a", "w")) : cannot open file 'myfile.csv1.csv|TRUEFALSE': Invalid argument
期望分割后的两个文件保持原格式,每个文件都包含表头,行数均等:
文件1
userid|logindatetime|logoutdatetime|description 111|2024-02-10 08:00:00|2024-02-10 08:00:00|systemadministrator 112|2024-02-11 08:00:00|2024-02-10 08:00:05|user1 113|2024-02-12 08:00:00|2024-02-10 08:00:10|user2 114|2024-02-13 08:00:00|2024-02-10 08:00:15|user3 115|2024-02-14 08:00:00|2024-02-10 08:00:20|user4
文件2
userid|logindatetime|logoutdatetime|description 116|2024-02-15 08:00:00|2024-02-10 08:00:25|user5 117|2024-02-16 08:00:00|2024-02-10 08:00:30|user6 118|2024-02-17 08:00:00|2024-02-10 08:00:35|user7 111|2024-02-18 08:00:00|2024-02-10 08:00:40|systemadministrator 119|2024-02-18 08:00:00|2024-02-10 08:00:45|user8
解决方案
问题分析
write.csv默认使用逗号分隔,且强制添加引号、行号,无法满足竖线分隔的需求,应改用write.table。- 参数位置错误:你把
sep、header等参数放到了paste0里,导致文件名被错误拼接,引发无法打开文件的错误。 - 分组逻辑错误:原代码
rowCount <- 2会把每2行分为一组,最终生成5个文件,不符合分成2个均等文件的需求。
正确代码
library(tidyverse) # 读取原文件,指定分隔符为竖线 data <- read_delim("myfile.csv", delim = "|", show_col_types = FALSE) # 计算每个数据行的分组:分成2组,均等分配行数 total_rows <- nrow(data) group_size <- ceiling(total_rows / 2) data <- data %>% mutate(Group = ceiling(row_number() / group_size)) # 分组写入文件,每个文件保留表头,保持原格式 data %>% group_by(Group) %>% group_walk(function(.x, .y) { # 定义输出文件名 output_file <- paste0("myfile_part_", .y$Group, ".csv") # 使用write.table设置正确参数 write.table(.x %>% select(-Group), # 移除分组列 file = output_file, sep = "|", # 竖线分隔 quote = FALSE, # 不添加引号 row.names = FALSE, # 不输出行号 col.names = TRUE) # 保留表头 })
参数说明
read_delim:专门用于读取自定义分隔符的文本文件,这里指定delim = "|"正确读取原文件。group_size:计算每组的行数,用ceiling(total_rows / 2)确保行数均等(如果总行数为奇数,第一组会多一行)。write.table:sep = "|":保持竖线分隔符;quote = FALSE:避免为字符串添加双引号;row.names = FALSE:不生成额外的行号列;select(-Group):移除分组列,避免写入到输出文件中。
验证结果
执行上述代码后,会生成myfile_part_1.csv和myfile_part_2.csv,内容与你期望的完全一致,保留了原文件的竖线分隔格式和表头,且行数均等。
内容的提问来源于stack exchange,提问作者GKC
相关产品推荐
相关产品推荐

