R语言如何从文本行提取内容生成指定列并导出csv/tsv文件
R语言实现单文本行转结构化表格的实操方案
核心问题说明
此前使用separate函数拆分失败的根本原因:输入文本里的Variable字段本身包含大量空格,传统按固定分隔符从前往后拆分的逻辑,会把Variable内容拆成零散碎片,同时最后一列的千位数值带格式空格(如1 389),需要额外做合并清洗。
本方案采用从文本末尾逆向匹配提取数值字段的逻辑,完全避开Variable字段带空格的拆分痛点,同时自动处理带空格的千位分隔数值。
完整可运行代码
# 加载tidyverse生态依赖 library(tidyverse) # 实际使用时替换为从txt文件读取的目标行,示例这里直接用题目给出的输入文本模拟 raw_input <- "PR7 - Autres produits d'exploitation 6.9 371 667 1 389" # 文本清洗与结构化转换 result_table <- tibble(raw_content = raw_input) %>% mutate( # 第一步:从文本最末尾提取2018列的值(匹配首尾为数字、中间可带空格的块,比如"1 389") col_2018 = str_extract(raw_content, "\\d[\\d ]*\\d(?=\\s*$)") %>% str_remove_all(" ") %>% # 去掉数字中间的空格,把"1 389"转成"1389" as.numeric(), # 把已经提取完2018值的剩余文本存为临时列,避免后续重复匹配 temp_text = str_remove(raw_content, "\\d[\\d ]*\\d\\s*$"), # 第二步:从剩余文本末尾提取2019列的值 col_2019 = str_extract(temp_text, "\\d+(?=\\s*$)") %>% as.numeric(), temp_text = str_remove(temp_text, "\\d+\\s*$"), # 第三步:从剩余文本末尾提取2020列的值 col_2020 = str_extract(temp_text, "\\d+(?=\\s*$)") %>% as.numeric(), temp_text = str_remove(temp_text, "\\d+\\s*$"), # 第四步:从剩余文本末尾提取note列的带小数的值 col_note = str_extract(temp_text, "\\d+\\.\\d+(?=\\s*$)") %>% as.numeric(), temp_text = str_remove(temp_text, "\\d+\\.\\d+\\s*$"), # 剩余的所有文本内容全部归为Variable列,去掉首尾多余空格 Variable = str_trim(temp_text) ) %>% # 按要求的列顺序整理,删除中间的临时文本列 select( Variable, note = col_note, `2020` = col_2020, `2019` = col_2019, `2018` = col_2018 ) # 控制台查看输出结果 print(result_table) # 保存为csv/tsv格式文件 write_csv(result_table, "output_structured.csv") # 如需导出TSV格式,替换为下面的代码: # write_tsv(result_table, "output_structured.tsv")
输出效果说明
运行代码后生成的表格完全匹配需求:
| Variable | note | 2020 | 2019 | 2018 |
|---|---|---|---|---|
| PR7 - Autres produits d'exploitation | 6.9 | 371 | 667 | 1389 |
实操注意点
- 逆向匹配逻辑不需要关注Variable字段内部有多少空格,只要最后四个字段是固定格式的数值,就能精准拆分
- 处理千位空格分隔的数值时,直接移除数字块内部的所有空格再转数值,不需要额外识别分隔符
- 正则使用正向先行断言定位文本末尾,不会误抓Variable字段内部包含的数字内容
内容的提问来源于stack exchange,提问作者Omar Hmissi
相关产品推荐
相关产品推荐

