使用R语言将TXT文件按每2000token或指定大小拆分的方法
R语言实现TXT按Token数/指定文件大小拆分
原有按行拆分的逻辑仅适合同结构表格数据按条目切割,按token/文件大小拆分建议直接处理原始文本流,避免读入时丢失格式、拆分错位。
你当前使用的固定行数拆分代码仅支持按行维度切割结构化读入的表格数据,无法适配按token、文件大小拆分的需求,以下是两种场景的可直接运行的实现:
方案1:按每2000Token拆分文本
这里的Token计数采用通用NLP分词规则,支持中英文混合文本,默认每块2000Token,可自行修改参数调整块大小。
首先安装依赖包(已安装可跳过):
install.packages(c("readr", "tokenizers"))
拆分实现代码:
library(readr) library(tokenizers) # 配置参数 input_path <- "/Users/oushiei/Desktop/##.txt" token_per_chunk <- 2000 # 每个拆分文件的Token数,可按需修改 output_prefix <- "JT_token_" # 输出文件名前缀 # 读入全量文本,按自然句拆分避免语义截断 full_text <- read_file(input_path) sentences <- unlist(tokenize_sentences(full_text)) sentence_tokens <- tokenize_count(sentences) # 按Token数累加切块 current_chunk <- c() current_token_count <- 0 chunk_id <- 1 for (i in seq_along(sentences)) { s_token <- sentence_tokens[i] # 如果当前块加新句子超过阈值,先写出当前块 if (current_token_count + s_token > token_per_chunk & length(current_chunk) > 0) { write_lines(paste(current_chunk, collapse = ""), paste0(output_prefix, chunk_id, "_.txt")) chunk_id <- chunk_id + 1 current_chunk <- c() current_token_count <- 0 } current_chunk <- c(current_chunk, sentences[i]) current_token_count <- current_token_count + s_token } # 写出最后剩余的内容 if (length(current_chunk) > 0) { write_lines(paste(current_chunk, collapse = ""), paste0(output_prefix, chunk_id, "_.txt")) }
- 如果处理的是和你原有代码场景一致的、每行一条记录的表格式TXT,可以把按句拆分的逻辑替换为按行读取,把
sentences <- unlist(tokenize_sentences(full_text))替换为sentences <- read_lines(input_path)即可,拆分时不会拆断单条完整记录。
方案2:按指定文件大小拆分
该方案按字节数切割文件,会自动校验多字节字符(中文、特殊符号等)完整性,不会出现切出乱码的问题,可自行指定每个文件的大小,无需安装第三方依赖包。
实现代码:
# 配置参数 input_path <- "/Users/oushiei/Desktop/##.txt" size_per_chunk <- 1024 * 1024 # 单文件大小,单位字节,示例为1MB,可按需调整 output_prefix <- "JT_size_" # 输出文件名前缀 # 读入原始二进制流 raw_bin <- readBin(input_path, what = "raw", n = file.info(input_path)$size) total_size <- length(raw_bin) chunk_start <- 1 chunk_id <- 1 while (chunk_start <= total_size) { chunk_end <- min(chunk_start + size_per_chunk - 1, total_size) current_chunk <- raw_bin[chunk_start:chunk_end] # 校验多字节字符完整性,避免切到中文中间出乱码 while (chunk_end < total_size) { lead_byte <- as.integer(current_chunk[length(current_chunk)]) if (lead_byte < 0x80) break # 单字节ASCII字符,边界合法 else if (lead_byte >= 0xC0 && lead_byte < 0xE0) back <- 1 else if (lead_byte >= 0xE0 && lead_byte < 0xF0) back <- 2 else if (lead_byte >= 0xF0 && lead_byte < 0xF8) back <- 3 else { chunk_end <- chunk_end - 1 current_chunk <- raw_bin[chunk_start:chunk_end] next } # 校验后续字节数是否足够 if (chunk_end - chunk_start + 1 >= back + 1) break chunk_end <- chunk_end - 1 current_chunk <- raw_bin[chunk_start:chunk_end] } # 写出当前块 writeBin(current_chunk, paste0(output_prefix, chunk_id, "_.txt")) chunk_id <- chunk_id + 1 chunk_start <- chunk_end + 1 }
- 拆分出的文件大小和指定阈值的误差仅为多字节字符对齐产生的几个字节偏移,不会出现内容损坏。
内容的提问来源于stack exchange,提问作者らちゃん
相关产品推荐
相关产品推荐

