如何用readr或data.table读取txt文件至第一个空行?
批量读取TXT文件并保留第一个空行前的内容(readr/data.table实现)
使用readr实现
思路
- 定位目标目录下所有
.txt文件的路径; - 按行读取单个文件内容;
- 找到第一个空行的位置,截取该位置之前的所有行;
- 合并截取的内容为完整文本,按需解析为R对象(仅需保留文本可跳过解析)。
代码示例
library(readr) library(purrr) library(stringr) # 获取所有txt文件的完整路径 txt_paths <- list.files(pattern = "\\.txt$", full.names = TRUE) # 定义单个文件的处理函数 process_single_txt <- function(file_path) { # 读取文件的每一行 all_lines <- read_lines(file_path) # 找到第一个空行的索引(支持含空格的空行,严格空行可改用all_lines == "") first_empty_line <- which(str_trim(all_lines) == "")[1] # 截取需要保留的内容:若无空行则保留全部,否则取到空行前一行 keep_content <- if (!is.na(first_empty_line)) { all_lines[1:(first_empty_line - 1)] } else { all_lines } # 合并为完整字符串 content_str <- paste(keep_content, collapse = "\n") # 解析为R对象(不需要的话直接返回content_str即可) eval(parse(text = content_str)) } # 批量处理所有文件,结果存为列表 processed_results <- map(txt_paths, process_single_txt)
使用data.table实现
思路
- 先获取所有
.txt文件路径; - 用
fread()按行读取文件(设置sep = NULL实现按行读取); - 定位第一个空行,截取目标内容;
- 合并文本并按需解析为R对象。
代码示例
library(data.table) library(stringr) # 获取所有txt文件的完整路径 txt_paths <- list.files(pattern = "\\.txt$", full.names = TRUE) # 定义单个文件的处理函数 process_single_txt_dt <- function(file_path) { # 按行读取文件,返回含一列的data.table dt <- fread(file_path, sep = NULL, header = FALSE, col.names = "line_content") # 找到第一个空行的索引 first_empty_line <- which(str_trim(dt$line_content) == "")[1] # 截取需要保留的内容 keep_content <- if (!is.na(first_empty_line)) { dt$line_content[1:(first_empty_line - 1)] } else { dt$line_content } # 合并为完整字符串 content_str <- paste(keep_content, collapse = "\n") # 解析为R对象(不需要则返回content_str) eval(parse(text = content_str)) } # 批量处理所有文件 processed_results_dt <- lapply(txt_paths, process_single_txt_dt)
注意事项
- 若空行是严格无任何字符的行,可将
str_trim(...) == ""替换为... == "",减少处理开销; - 仅需保留文本内容时,直接返回
content_str即可,无需执行解析步骤; - 处理超大量文件时,
data.table的fread()在读取速度上会有明显优势。
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

