分享

使用R语言将多个txt汇总到一个csv文件中

 大邓的Python 2022-07-30 发布于瑞典

任务

使用R语言,对多个文件夹内的数百个txt汇总到一个csv文件内。数据集点击阅读原文获取


数据集

01-21年,全国各地市政府工作报告数据集。


任务分解

1.  使用list.files获取文件路径列表
2.  定义需要的函数
    -   使用readtext::readtext()函数读取报告文本
    -   年份函数、省份函数
3.  对每个文件路径,根据2得到三个字段信息,构造tibble结构;
4.  步骤2和步骤3使用bind_cols合并成一个tibble
5.  readr::write_csv()函数存至data.csv
6.  审查data.csv

数据存在province文件内, 该点击下载该数据集

1. txt路径列表

使用 list.files函数查看

  • 文件夹路径列表
  • 文件路径列表

province内的文件夹路径列表

    library(tidyverse)
    dirs <- list.files('province', full.names = TRUE)
    head(dirs)
    
    ## [1] "province/上海"   "province/云南"   "province/内蒙古" "province/北京"  
    ## [5] "province/吉林"   "province/四川"

所有省份文件夹内的文件路径列表

    files <- list.files(dirs, full.names = TRUE)
    head(files)
    
    ## [1] "province/上海/2003年上海政府工作报告.txt"
    ## [2] "province/上海/2004年上海政府工作报告.txt"
    ## [3] "province/上海/2005年上海政府工作报告.txt"
    ## [4] "province/上海/2006年上海政府工作报告.txt"
    ## [5] "province/上海/2007年上海政府工作报告.txt"
    ## [6] "province/上海/2008年上海政府工作报告.txt"

共有617个txt文件

    length(files)
    
    ## [1] 617

2.1 readtext读取txt

使用 readtext::readtext 批量读取 多个txt

    txts_df <- readtext::readtext(files)
    head(txts_df)
    
    ## readtext object consisting of 6 documents and 0 docvars.
    ## # Description: df [6 × 2]
    ##   doc_id                     text                         
    ##   <chr>                      <chr>                        
    ## 1 2003年上海政府工作报告.txt "\"  各位代表, 现在\"..."   
    ## 2 2004年上海政府工作报告.txt "\" 各位代表:\n\n  \"..."   
    ## 3 2005年上海政府工作报告.txt "\"各位代表:\n\n  现\"..."
    ## 4 2006年上海政府工作报告.txt "\"各位代表:\n  上海\"..."
    ## 5 2007年上海政府工作报告.txt "\"  政府工作报告\n \"..."
    ## 6 2008年上海政府工作报告.txt "\"\n\t政府工作报告\n\n\"..."

检查text字段长度,是否为617.

    length(txts_df[['text']])
    
    ## [1] 617

2.2 定义功能函数

数据整理到一个csv,我们想保存四个字段,分别是

  • txt文件名
  • 年份
  • 省(市)名
  • 工作报告内容

年份和省份需要通过定义函数实现~

    s<-basename("province/上海/2003年上海政府工作报告.txt"
    substr(s, 14)
    
    ## [1] "2003"

    year_func <- function(filepath){
      year <- filepath %>% 
        basename() %>% 
        substr(14)
      return (year)
    }
    
    name_func <- function(file){
      file <- basename(file)
      name <- gsub('政府工作报告.txt''', file) 
      name <- stringr::str_sub(name, start=6)
      return (name)
    }
    
    file <- "province/上海/2003年上海政府工作报告.txt"
    year_func(file)
    name_func(file)
    
    ## [1] "2003"
    ## [1] "上海"

txts_df 是一个特殊的tibble数据类型。现在需要构造年份、省份函数,获取另外一个tibble。

    year_province_df <- tibble(
      year = year_func(txts_df$doc_id),
      province = lapply(txts_df$doc_id, name_func) %>% unlist()
      )
    
    head(year_province_df)
    
    ## # A tibble: 6 × 2
    ##   year  province
    ##   <chr> <chr>   
    ## 1 2003  上海    
    ## 2 2004  上海    
    ## 3 2005  上海    
    ## 4 2006  上海    
    ## 5 2007  上海    
    ## 6 2008  上海

4. 合并两个tibble

cbind_rows()合并两个tibble

    res_df <- bind_cols(year_province_df, txts_df)
    head(res_df)
    
    ## # A tibble: 6 × 4
    ##   year  province doc_id                     text                                
    ##   <chr> <chr>    <chr>                      <chr>                               
    ## 1 2003  上海     2003年上海政府工作报告.txt "  各位代表, 现在,我代表上海市人… 
    ## 2 2004  上海     2004年上海政府工作报告.txt " 各位代表:\n\n    现在,我代表上… 
    ## 3 2005  上海     2005年上海政府工作报告.txt "各位代表:\n\n  现在,我代表上海…
    ## 4 2006  上海     2006年上海政府工作报告.txt "各位代表:\n  上海市国民经济和社…
    ## 5 2007  上海     2007年上海政府工作报告.txt "  政府工作报告\n  ――2007年1月2…
    ## 6 2008  上海     2008年上海政府工作报告.txt "\n\t政府工作报告\n\n\t——2008年1月2…

5. 存入csv

使用 write.table(x, file, sep) 写入data.csv

  • x 待存储数据对象
  • file csv文件路径
  • delim 分割符
    readr::write_csv(x=res_df, 
                     file='data.csv'
                     col_names=T

6. 检查data.csv

尝试读取 data.csv

    df <- readr::read_csv('data.csv')

    ## Rows: 617 Columns: 4
    ## ── Column specification ────────────────────────────────────────────────────────
    ## Delimiter: ","
    ## chr (3): province, doc_id, text
    ## dbl (1): year
    ## 
    ## ℹ Use `spec()` to retrieve the full column specification for this data.
    ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    head(df)
    ## # A tibble: 6 × 4
    ##    year province doc_id                     text                                
    ##   <dbl> <chr>    <chr>                      <chr>                               
    ## 1  2003 上海     2003年上海政府工作报告.txt "各位代表, 现在,我代表上海市人民… 
    ## 2 2004 上海     2004年上海政府工作报告.txt "各位代表:\n\n    现在,我代表上海…
    ## 3 2005 上海     2005年上海政府工作报告.txt "各位代表:\n\n  现在,我代表上海…
    ## 4 2006 上海     2006年上海政府工作报告.txt "各位代表:\n  上海市国民经济和社…
    ## 5  2007 上海     2007年上海政府工作报告.txt "  政府工作报告\n  ――2007年1月2…
    ## 6  2008 上海     2008年上海政府工作报告.txt "\n\t政府工作报告\n\n\t——2008年1月2…

实验数据

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多