办公问答网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 76|回复: 6

【Tidyverse优雅编程】:R语言 批量word文档转Excel

[复制链接]

1

主题

6

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-1-5 13:05:24 | 显示全部楼层 |阅读模式
问题来自头条文章:
他们总说,R 语言处理文本数据、自动化办公不行,是真不行吗?本篇就来个 吊打 Python 看看。
<hr/>1 问题描述


  • 有多个 word 文档:



  • 文档内容:





  • 需求:
批量读取 word 文档内容,按名目:序号、方名、组成、用法、主治、备注,整理成 Excel 表格,结果如下:


注:若未包含【组成】【用法】【主治】,则内容都归入备注。
2 解决问题

首先强调:文本数据处理,肯定离不开正则表达式!

  • 加载包
library(readtext)     # 读取文本数据
library(tidyverse)    # stringr, tidyr包, 处理文本数据
library(writexl)      # 写出到Excel

  • 批量读取 word 文档
df = readtext("word")     # 注意,word文档不能在打开状态
df

得到的结果是数据框,每个文档占一行,doc_id 列是文件名,text 列是文档内容,一个文档内容整个是一个字符串。

  • 按药方切分列
df = df %>%
  separate_rows(text, sep = "\n(?=\\d{5})")   # 切分标志是: \n五位数字序号
df

此时,一个药方占一行了。

  • 解决一个药方的信息提取,写成函数
f = function(x) {
  tibble(
    序号 = str_extract(x, "^\\d{5}"),
    方名 = str_extract(x, "(?<=\\d·).*?(?=\n)"),
    组成 = str_extract(x, "(?<=【组成】).*?(?=\n【用法】|$)"),
    用法 = str_extract(x, "(?<=【用法】).*?(?=\n【主治】|$)"),
    主治 = str_extract(x, "(?<=【主治】).*?(?=\n|$)"),
    备注 = ifelse(str_detect(x, "【"), NA, str_extract(x, "(?<=\n).*$")))
}说明:都是正则表达式提取,主要用到零宽断言,根据两端标志提取中间想要的内容。为什么看着这么啰嗦呢?是因为数据是有陷阱的:不是每个药方都包含【组成】、【用法】、【主治】,所以右端需要设置为下一项或结尾标志$。
测试一个看看:
f(df$text[[1]])

没问题!(我差点被对不齐给骗了)

  • 循环迭代,批量解决问题
就是把函数 f 依次应用到数据的 text列,结果按行合并:
rlt = map_dfr(df$text, f)
rlt


  • 写出到 Excel 文件
write_xlsx(rlt, "结果表.xlsx")结果就是问题描述中的结果表(略)。
问题解决!
以上是为了给大家展示中间过程,方便大家理解。拿掉不必要的中间过程,借助管道,完整代码如下:
library(readtext)     # 读取文本数据
library(tidyverse)    # stringr, tidyr包, 处理文本数据
library(writexl)      # 写出到Excel

df = readtext("word") %>%
  separate_rows(text, sep = "\n(?=\\d{5})")

f = function(x) {
  tibble(
    序号 = str_extract(x, "^\\d{5}"),
    方名 = str_extract(x, "(?<=\\d·).*?(?=\n)"),
    组成 = str_extract(x, "(?<=【组成】).*?(?=\n【用法】|$)"),
    用法 = str_extract(x, "(?<=【用法】).*?(?=\n【主治】|$)"),
    主治 = str_extract(x, "(?<=【主治】).*?(?=\n|$)"),
    备注 = ifelse(str_detect(x, "【"), NA, str_extract(x, "(?<=\n).*$")))
}

map_dfr(df$text, f) %>%
  write_xlsx("结果表.xlsx")<hr/>附录

我主张的数据编程思维




我的 R 语言新书:
电子抢读版已上线(人邮)异步社区,纸质版预计12月底上市:
回复

使用道具 举报

1

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-5 13:05:34 | 显示全部楼层
太强了
回复

使用道具 举报

0

主题

9

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2023-1-5 13:06:28 | 显示全部楼层
太强了~也看了那个python版本的,写的太啰嗦了
回复

使用道具 举报

1

主题

11

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-1-5 13:06:35 | 显示全部楼层
我就是喜欢看张老师有理有据理直气壮地展示R语言的强大
回复

使用道具 举报

0

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-5 13:07:02 | 显示全部楼层
怎么说的。r语言在某方面确实不错。[飙泪笑]
回复

使用道具 举报

2

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-1-5 13:07:12 | 显示全部楼层
老师好,我想用word文档模拟学习
请问有网盘链接吗?谢谢!
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-5 13:07:40 | 显示全部楼层
老师想进群和你深入学习 可以私聊沟通吗?谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|办公问答网

GMT+8, 2025-7-4 23:52 , Processed in 0.110717 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc. Templated By 【未来科技 www.veikei.com】设计

快速回复 返回顶部 返回列表