利用java从docx文档中提取文本内容

使用Apache的第三方jar包,地址为https://poi.apache.org/

docx文档内容如图:



目录结构:



每个文件夹的名称为日期加上来源,例如:20180618医院,每个docx文档的名称是被试的姓名和来源地,例如:小明-xx社区

代码如下:

MriReportService.java

  1. package services;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.LinkedList;
  8. import java.util.regex.Pattern;
  9. public class MriReportService {
  10. public static String[] findYearAndSource(File file) {
  11. String[] result = new String[2];
  12. // 日期
  13. String dateStr = file.getParentFile().getName();
  14. // System.out.println(dateStr);
  15. if (Pattern.compile("\\d").matcher(dateStr).find()) {
  16. dateStr = Pattern.compile("-").matcher(dateStr).replaceAll("");
  17. result[0] = dateStr.substring(0, 8);
  18. } else {
  19. result[0] = "";
  20. }
  21. // 社区
  22. String fileName = file.getName();
  23. if (fileName.indexOf("-") < 0) {
  24. fileName = Pattern.compile("\\.").matcher(fileName).replaceAll("-.");
  25. }
  26. fileName = Pattern.compile("--+").matcher(fileName).replaceAll("-");
  27. result[1] = fileName.substring(fileName.indexOf("-") + 1, fileName.indexOf("."));
  28. return result;
  29. }
  30. public static LinkedList<File> findAllFile(String rootPath) {
  31. File file = new File(rootPath);
  32. LinkedList<File> list = new LinkedList<>();
  33. if (file.exists()) {
  34. File[] subDirs = file.listFiles();
  35. for (File tmpDir : subDirs) {
  36. // System.out.println(tmpDir);
  37. for (File tmpFile : tmpDir.listFiles()) {
  38. if (tmpFile.isFile() && tmpFile.getName().indexOf("~$") < 0) {
  39. list.add(tmpFile);
  40. }
  41. }
  42. }
  43. }
  44. return list;
  45. }
  46. public static ArrayList<String> findSub(String docx) {
  47. String name = "";
  48. String gender = "";
  49. String age = "";
  50. String MRICheck = "";
  51. String MRIMem = "";
  52. if (!Pattern.compile("性别:").matcher(docx).find() || !Pattern.compile("年龄:").matcher(docx).find()) {
  53. try {
  54. name = docx.substring(docx.indexOf("姓名:") + 3, docx.indexOf("检查项目:"));
  55. MRICheck = docx.substring(docx.indexOf("MRI检查描述:") + 8, docx.indexOf("MRI印象:"));
  56. MRIMem = docx.substring(docx.indexOf("MRI印象:") + 6, docx.indexOf("报告医师:"));
  57. } catch (StringIndexOutOfBoundsException e) {
  58. // name = "";
  59. }
  60. } else {
  61. name = docx.substring(docx.indexOf("姓名:") + 3, docx.indexOf("性别:"));
  62. gender = docx.substring(docx.indexOf("性别:") + 3, docx.indexOf("年龄:"));
  63. age = docx.substring(docx.indexOf("年龄:") + 3, docx.indexOf("检查项目:"));
  64. MRICheck = docx.substring(docx.indexOf("MRI检查描述:") + 8, docx.indexOf("MRI印象:"));
  65. MRIMem = docx.substring(docx.indexOf("MRI印象:") + 6, docx.indexOf("报告医师:"));
  66. }
  67. ArrayList<String> result = new ArrayList<>();
  68. result.add(name);
  69. result.add(gender);
  70. result.add(age);
  71. result.add(MRICheck);
  72. result.add(MRIMem);
  73. return result;
  74. }
  75. }

Main.java

  1. import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
  2. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  3. import java.io.*;
  4. import java.util.ArrayList;
  5. import java.util.regex.*;
  6. import static services.MriReportService.findAllFile;
  7. import static services.MriReportService.findSub;
  8. import static services.MriReportService.findYearAndSource;
  9. public class Main {
  10. public static void main(String[] args) throws Exception {
  11. if (args.length < 2) {
  12. System.out.println("请输入源文件和目标文件的完整路径!");
  13. System.out.println("举个例子:java -jar docx2csv.jar d:\\核磁报告 d:\\result.csv");
  14. System.exit(-1);
  15. }
  16. String srcPath = args[0];
  17. String outPath = args[1];
  18. ArrayList<ArrayList<String>> result = new ArrayList<>();
  19. for (File tmpFile : findAllFile(srcPath)) {
  20. String[] yearAndSrc = findYearAndSource(tmpFile);
  21. FileInputStream fis = new FileInputStream(tmpFile);
  22. XWPFDocument xdoc = new XWPFDocument(fis);
  23. XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
  24. String docx = extractor.getText();
  25. docx = Pattern.compile("\\s").matcher(docx).replaceAll("");
  26. ArrayList<String> tmpRe = findSub(docx);
  27. tmpRe.add(yearAndSrc[0]);
  28. tmpRe.add(yearAndSrc[1]);
  29. result.add(tmpRe);
  30. fis.close();
  31. }
  32. write(result, outPath);
  33. }
  34. public static void write(ArrayList<ArrayList<String>> result, String outPath) throws IOException {
  35. BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(
  36. new FileOutputStream(outPath), "GBK"));
  37. for (ArrayList<String> tmpStrs : result) {
  38. // System.out.println();
  39. bufferedWriter.write(tmpStrs.get(0) + "," + tmpStrs.get(1) + ","
  40. + tmpStrs.get(2) + "," + tmpStrs.get(3) + ","
  41. + tmpStrs.get(4) + "," + tmpStrs.get(5) + ","
  42. + tmpStrs.get(6));
  43. bufferedWriter.newLine();
  44. }
  45. bufferedWriter.close();
  46. }
  47. }

利用java从docx文档中提取文本内容的更多相关文章

  1. 如何使用免费PDF控件从PDF文档中提取文本和图片

             如何使用免费PDF控件从PDF文档中提取文本和图片 概要 现在手头的项目有一个需求是从PDF文档中提取文本和图片,我以前也使用过像iTextSharp, PDFBox 这些免费的PD ...

  2. MVC架构下,使用NPOI读取.DOCX文档中表格的内容

    1.使用NPOI,可以在没有安装office的设备上读wiod.office.2.本文只能读取.docx后缀的文档.3.MVC架构中,上传文件只能使用form表单提交,转到控制器后要依次实现文件上传. ...

  3. 使用Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)(转)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  4. 【python】使用HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies

    一.从HTML文档中提取链接 模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁.高效地解析HTML文档. 处理HTML文档的时候,我们常常需要从其中提取出所有的链接.使用HTM ...

  5. Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  6. python 解析docx文档的方法,以及利用Python从docx文档提取插入的文本对象和图片

    首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. ...

  7. java使用正则从爬虫爬的txt文档中提取QQ邮箱

    我的需求是从一堆文档中提取出qq邮箱,写了这篇帖子,希望能帮助和我有一样需求的人,谢谢!...... import java.io.BufferedReader; import java.io.Fil ...

  8. Java 在 Word 文档中使用新文本替换指定文本

    创作一份文案,经常会高频率地使用某些词汇,如地名.人名.人物职位等,若表述有误,就需要整体撤换.文本将介绍如何使用Spire.Doc for Java,在Java程序中对Word文档中的指定文本进行替 ...

  9. Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...

随机推荐

  1. Python 如何随机打乱列表(List)排序

    场景: 现在有一个list:[1,2,3,4,5,6],我需要把这个list在输出的时候,是以一种随机打乱的形式输出. 专业点的术语:将一个容器中的数据每次随机逐个遍历一遍. 注意:不是生成一个随机的 ...

  2. 存储系列之 RAID技术原理简介

    引言:RAID技术是现代大规模存储的基础,“基础(技术)是拿来革命的”.我查raid相关资料时,查布尔运算,竟然一路查到“香农原理”,这不是有个视频中HW的任总提到的吗,多基础的东西,任总却毫不含糊, ...

  3. 【Spring】Spring AOP详解(转载)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  4. OPCUA+MQTT构建物联网通用框架

    写在前面: 为了应对标准化和跨平台的趋势,更好的推广OPC,OPC基金会在OPCDA成功应用的基础上推出了一个新的OPC标准——OPC UA,OPCUA不再基于分布式组件对象模型(DCOM),而是以面 ...

  5. html5拖动监听

    在拖动目标上触发事件 (源元素): ondragstart - 用户开始拖动元素时触发 ondrag - 元素正在拖动时触发 ondragend - 用户完成元素拖动后触发 释放目标时触发的事件: o ...

  6. 要小心 JavaScript 的事件代理

    我们知道,如果给 form 里面的 button 元素绑定事件,需要考虑它是否会触发 form 的 submit 行为.除此之外,其它场合给 button 元素绑定事件,你几乎不用担心这个事件会有什么 ...

  7. S32DS编译程序出现Type region `SRAM' overflowed by 19240 bytes错误

    用S32DS编译工程遇到Type region `SRAM' overflowed by 19240 bytes错误(芯片为S9KEAZ64AMLH) 程序中未初始化的变量存放SRAM中 当程序出现未 ...

  8. Flask 蓝图进行路由分发.md

    Flask 蓝图进行路由分发 Flask虽然说是一个轻型web框架,但也总不能用一个py文件写完全部view吧,所以我们要把路由分到不同的py文件中.这就需要用到蓝图了. 一 创建一个py文件 用于处 ...

  9. leetcode976之三角形最大周长

    题目描述: 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. def largePara(A): A. ...

  10. Rocket - tilelink - HintHandler

    https://mp.weixin.qq.com/s/MHW_aBSL72YNee9bVWWeaw   简单介绍HintHandler的实现.   ​​   1. 基本功能   实现Hint请求的处理 ...