在R中读取结构不规则的制表符分隔.DAT文件
处理格式混乱的制表符分隔DAT文件
我需要读取一个本该是制表符分隔的.DAT文件,但实际结构比预期混乱。该文件应包含5列:
- 1到正无穷的数值
- 格式为
MM/DD/YYYY的日期 - 格式为
HH:MM:SS或HH:MM的时间 - 自由文本
- 自由文本
通过readLines提取的文件片段如下:
c("12315\t01/01/1999\t22:31\tOther, specify - Test\tBILE TUCT", "UNKNOWN", "CONTRAINDICATION, STOP", "75\t01/28/2021\t19:34\tct\tBilateral (unable to cannulate), normal", "75\t07/01/2014\t15:01:02\tCT/MRI\tCT chest shows collapse...otherwise OKAY. ETT okay. ", "CT neg. Left s w/1mm cyst.", "75\t06/13/2018\t14:30\tCardiac cath\tNormal A, EF 66%, no AS/MR" )
期望输出为如下规范结构的表格:
| V1 | V2 | V3 | V4 | V5 |
|---|---|---|---|---|
| 12315 | 01/01/1999 | 22:31 | Other, specify - Test | BILE TUCT, UNKNOWN, CONTRAINDICATION, STOP |
| 75 | 01/28/2021 | 19:34 | ct | Bilateral (unable to cannulate), normal |
| 75 | 07/01/2014 | 15:01:02 | CT/MRI | CT chest shows collapse...otherwise OKAY. ETT okay. CT neg. Left s w/1mm cyst. |
| 75 | 06/13/2018 | 14:30 | Cardiac cath | Normal A, EF 66%, no AS/MR |
解决方案
核心思路是先识别每条完整记录的起始行,再把后续属于同一条记录的多行内容合并到第5列,最后拆分制表符得到规范数据:
# 模拟读取的行数据 lines <- c("12315\t01/01/1999\t22:31\tOther, specify - Test\tBILE TUCT", "UNKNOWN", "CONTRAINDICATION, STOP", "75\t01/28/2021\t19:34\tct\tBilateral (unable to cannulate), normal", "75\t07/01/2014\t15:01:02\tCT/MRI\tCT chest shows collapse...otherwise OKAY. ETT okay. ", "CT neg. Left s w/1mm cyst.", "75\t06/13/2018\t14:30\tCardiac cath\tNormal A, EF 66%, no AS/MR" ) # 识别记录起始行:以数字+制表符开头的行是每条记录的第一行 start_rows <- grepl("^\\d+\t", lines) # 为每行分配组ID,把同一条记录的行归为一组 group_ids <- cumsum(start_rows) # 按组合并行,用逗号分隔多行内容 combined_lines <- tapply(lines, group_ids, function(x) paste(x, collapse = ", ")) # 拆分制表符并转换为数据框 library(data.table) result <- fread(paste(combined_lines, collapse = "\n"), sep = "\t", col.names = paste0("V", 1:5)) # 查看结果 print(result)
代码说明:
grepl("^\\d+\t", lines):匹配以数字加制表符开头的行,确定每条记录的起始位置cumsum(start_rows):生成连续的组ID,让同一条记录的所有行拥有相同IDtapply按组合并行,把原本拆分到多行的第5列内容合并成一个字符串- 最后用
fread读取合并后的文本,自动按制表符拆分得到规范的5列数据框
内容的提问来源于stack exchange,提问作者afleishman
相关产品推荐
相关产品推荐

