批量获取文件名称并匹配

R
stringr
Author

Rui

Published

July 12, 2024

背景

现有一文件夹,其中包含若干二级子文件夹并且命名为“街道+二级文件夹中包含的企业简介数量”(例如“白龙桥镇153家”),当地所有规上企业的简介(word文档或pdf)按照企业所在街道放入对应的二级子文件夹中。

同时,另有一份企业清单(excel表格),要求按照文件夹中对应的规上企业的简介匹配出企业所在的街道。文件夹内容如下图所示:

  • 可以看出所有二级子文件夹的名称都是按照固定格式命名的,而子文件夹中的word文档也是以企业名称+“企业简介”的固定格式命名的,且有的是.doc文件有的是.docx文件有的是.pdf文件。

  • 那么可以将文件夹中所有的word文档名称提取出来,再将二级子文件夹的名称提取出来,二者合并得到一张包含规上企业所在街道的总表。

  • 再对该表格中的内容使用正则表达式进行清洗,将街道一列中“XX家”的字样删去,将企业名称一列中“简介”、“企业简介”以及文件后缀名等字样删去。

  • 将清洗好的总表与给定好的企业清单进行匹配从而得到对应的街道。至此完成。

那我们现在就开始做!

提取文档路径

list.dirs 函数接收一个顶层文件夹的路径(绝对路径和相对路径都可以)并返回其中所有二级子文件夹的路径。

# 设置顶层文件夹路径  
top_directory <- "./data/规上企业简介"  
  
# 获取所有子文件夹的名称  
subdirectories <- list.dirs(top_directory, recursive = FALSE) 

subdirectories
##  [1] "./data/规上企业简介/白龙桥镇153家" "./data/规上企业简介/城东街道2家"  
##  [3] "./data/规上企业简介/城西街道1家"   "./data/规上企业简介/蒋堂镇20家"   
##  [5] "./data/规上企业简介/琅琊镇8家"     "./data/规上企业简介/罗店镇9家"    
##  [7] "./data/规上企业简介/乾西乡21家"    "./data/规上企业简介/新狮街道10家" 
##  [9] "./data/规上企业简介/雅畈镇17家"    "./data/规上企业简介/长山乡1家"    
## [11] "./data/规上企业简介/竹马乡22家"

不难看出{subdirectories}是一个字符串列表,里面的每一个元素都是二级子文件夹的相对路径。

提取文档名称

可以使用 list.files 来提取一个文件夹下文件的名称,并返回一个字符串向量。

list.files(subdirectories[2], full.names = FALSE, recursive = TRUE)
## [1] "金华德仁康复辅具有限公司企业简介.docx"    
## [2] "金华中燃城市燃气发展有限公司企业简介.docx"

通过使用 for 循环来遍历每一个二级子文件夹的路径来获得所有二级子文件下面的文件的名称。

由于 for 循环只保存最后一次遍历的结果,所以还需要设置一个空的表格来记录中间的结果。这个表格至少需要两列,第一列为二级子文件夹的名称,第二列为二级子文件夹下面的文档的名称。

至于二级子文件夹的名称,可以用 basename 函数获取:

basename(subdirectories[2])
## [1] "城东街道2家"

下面是完整的循环:

# 初始化一个空的data.frame来存储结果  
results <- data.frame(Subdirectory = character(),  
                      Filename = character(),  
                      stringsAsFactors = FALSE)  
  
# 遍历每个子文件夹  
for (subdir in subdirectories) {  
  # 获取子文件夹中的所有文件名称  
  files <- list.files(subdir, full.names = FALSE, recursive = TRUE)  
    
  # 为每个文件创建一个新的行,并添加到results data.frame中  
  new_rows <- data.frame(Subdirectory = rep(basename(subdir), length(files)),  
                         Filename = files,  
                         stringsAsFactors = FALSE)  
  results <- rbind(results, new_rows)  
}  
  
# 查看结果  
head(results)
##    Subdirectory                              Filename
## 1 白龙桥镇153家 金华鼎筑建材科技有限公司企业简介.docx
## 2 白龙桥镇153家 金华峰瑞车业科技有限公司公司简介.docx
## 3 白龙桥镇153家     金华锋创科技有限公司企业简介.docx
## 4 白龙桥镇153家       金华海晨木业限公司企业简介.docx
## 5 白龙桥镇153家     金华浩翔汽配有限公司企业简介.docx
## 6 白龙桥镇153家 金华和美休闲用品有限公司企业简介.docx

表格清洗

  • 针对第一列,希望把”白龙桥镇153家”改为”白龙桥镇”

  • 针对第二列,希望把”金华和美休闲用品有限公司企业简介.docx”变为”金华和美休闲用品有限公司”

可以使用 tidyverse 以及 stringr 包中的 str_remove() 函数加上正则表达式来统一处理:

library(tidyverse)
library(stringr)

results <- results %>%
  mutate(Subdirectory = str_remove(Subdirectory, "\\d+家")) %>%
  mutate(Filename = str_remove(Filename, "\\..*"),
         Filename = str_remove(Filename, "企业简介|简介|企业"))
  • 通过 str_remove() 函数和正则表达式”\d+家”来去除数字+“家”的字符;

  • “.”表示匹配点号”.”(在正则表达式中点号是一个特殊字符,所以需要用反斜杠进行转义),“.”表示匹配任意数量的任意字符(包括零个字符)。因此,“..”会匹配从点号开始到字符串末尾的所有字符。从而把”.doc”以及”.docx”匹配出来并删除。

  • 其中”企业简介|简介|企业”表示匹配”企业简介”或”简介”或”企业”这三个字符串中的任意一个。

head(results)
##   Subdirectory                     Filename
## 1     白龙桥镇     金华鼎筑建材科技有限公司
## 2     白龙桥镇 金华峰瑞车业科技有限公司公司
## 3     白龙桥镇         金华锋创科技有限公司
## 4     白龙桥镇           金华海晨木业限公司
## 5     白龙桥镇         金华浩翔汽配有限公司
## 6     白龙桥镇     金华和美休闲用品有限公司

匹配

读取需要进行匹配的企业清单:

# 读取xlsx文件
library(readxl)

company <- read_excel("./data/某地区轻量化新材料企业清单.xlsx", sheet = "Sheet1")
company
## # A tibble: 72 × 2
##     序号 企业名称                    
##    <dbl> <chr>                       
##  1     1 浙江今飞新材料有限公司      
##  2     2 金华市今飞轻合金材料有限公司
##  3     3 浙江锦凯智塑科技有限公司    
##  4     4 浙江承承科技有限公司        
##  5     5 浙江忆赫新材料有限公司      
##  6     6 浙江惠盛新材料有限公司      
##  7     7 金华氢途科技有限公司        
##  8     8 金华正朔增材制造有限公司    
##  9     9 金华市耀胜塑业有限公司      
## 10    10 金华市永达金属结构有限公司  
## # ℹ 62 more rows

接下来的匹配及很简单了:

com <- company %>%
  left_join(results, by = c("企业名称" = "Filename")) %>%
  rename("乡镇(街道)" = "Subdirectory")

com %>% head() %>% knitr::kable()
序号 企业名称 乡镇(街道)
1 浙江今飞新材料有限公司 白龙桥镇
2 金华市今飞轻合金材料有限公司 NA
3 浙江锦凯智塑科技有限公司 白龙桥镇
4 浙江承承科技有限公司 白龙桥镇
5 浙江忆赫新材料有限公司 白龙桥镇
6 浙江惠盛新材料有限公司 白龙桥镇

结果保存到本地

write_excel_csv(com, "./output/企业所在街道.csv")