You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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
解决方案

问题分析

  1. write.csv默认使用逗号分隔,且强制添加引号、行号,无法满足竖线分隔的需求,应改用write.table。
  2. 参数位置错误:你把sep、header等参数放到了paste0里,导致文件名被错误拼接,引发无法打开文件的错误。
  3. 分组逻辑错误:原代码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:31:06