R语言如何将56个短横线分隔的TXT文件解析导入为dataframe
R 读取特殊分块键值对TXT文件的解决方案
你之前直接用read_delim指定分隔符为:无法得到正确结果,是因为该文件不是按行存储单条记录的常规结构化文件,而是用短横线分隔分块、每块内逐行存储键值对的特殊结构,需要先做预处理再转成数据框,两种常用实现方案如下:
方案1:仅使用基础R实现
无需安装额外依赖,适合轻量使用场景:
- 第一步:读取所有行并过滤分割线、去除首尾空格
# 读取文件所有行 lines <- readLines("TextFileName.txt") # 过滤全是短横线的分割行,同时去除每行首尾空格 lines <- trimws(lines[!grepl("^-{5,}$", lines)])
- 第二步:将每行按
:+空格拆分为键、值两部分
kv_pairs <- strsplit(lines, ": ", fixed = TRUE)
- 第三步:按记录分组,示例中每个记录包含3个键值对,可根据实际列数调整分组参数
3
record_groups <- split(kv_pairs, ceiling(seq_along(kv_pairs)/3))
- 第四步:转换为数据框
df <- do.call(rbind, lapply(record_groups, function(x) { setNames(data.frame(t(sapply(x, `[`, 2)), stringsAsFactors = FALSE), sapply(x, `[`, 1)) })) # 按需转换列类型,比如将Record列转为整数 df$Record <- as.integer(df$Record)
方案2:使用tidyverse生态实现
代码更简洁,可适配记录列数不固定的场景:
- 先加载依赖包
library(tidyverse)
- 链式处理直接得到结果
df <- read_lines("TextFileName.txt") %>% trimws() %>% # 过滤分割线和空行 discard(~grepl("^-{5,}$|^$", .x)) %>% # 拆分键、值 str_split_fixed(": ", n = 2) %>% as.data.frame() %>% setNames(c("key", "value")) %>% # 自动按Record标记不同记录的ID mutate(record_id = cumsum(key == "Record")) %>% # 长表转宽表得到最终结构 pivot_wider(names_from = key, values_from = value) %>% # 清理多余列、自动适配列类型 select(-record_id) %>% type.convert(as.is = TRUE)
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

