Java 解析常见文本文件数据

文章目录

  • 前言
  • 简介
  • 第一步:引入依赖
  • 第二步:编写文件解析处理类
  • 第三步:Word解析类
  • 第四步:PDF解析类
  • 第五步:Txt解析类
  • 总结


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、


提示:以下是本篇文章正文内容,下面案例可供参考

简介

在日常开发中我们经常会解析各类文件如:.docx、pdf、txt 读取文件内容进行下一步逻辑处理,本文例举解析上述文件

第一步:引入依赖

友情链接:创建Springboot 项目请移步 点我!点我!点我!

		<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency><!--  提取pdf中的文字--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.6</version></dependency><!--获取pdf文件的总页数--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>1.8.11</version></dependency><!-- poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version></dependency><!-- FileUtils依赖--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>

第二步:编写文件解析处理类

 	// 定义静态的文件后缀private static final String SUFFIX_DOC = ".doc";private static final String SUFFIX_DOCX = ".docx";private static final String SUFFIX_PDF = ".pdf";private static final String SUFFIX_TXT = ".txt";/*** .* 根据文件类型解析文件内容** @param file 文件* @return 解析内容*/private static String readFileToString(File file) {StringBuilder readStr = new StringBuilder();String fileType = file.getName().substring(file.getName().lastIndexOf("."));log.debug("解析文件类型为[{}]文件", fileType);switch (fileType) {case SUFFIX_DOC: {readStr.append(WordUtil.readWord(SUFFIX_DOC, file.getAbsolutePath()));break;}case SUFFIX_DOCX: {readStr.append(WordUtil.readWord(SUFFIX_DOCX, file.getAbsolutePath()));break;}case SUFFIX_PDF: {readStr.append(PDFToWordUtil.getTextFromPdf(file.getAbsolutePath()));break;}case SUFFIX_TXT: {readStr.append(TxtUtil.readTxtFile(file.getAbsolutePath()));break;}default: {log.error("文件类型不正确,请上传.doc、.docx、.pdf、.txt后缀文件");throw new RuntimeException("文件类型不正确,请上传.doc、.docx、.pdf、.txt后缀文件");}}return readStr.toString();}

第三步:Word解析类


import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.FileInputStream;
import java.io.InputStream;/*** Word 操作工具类*/
@Slf4j
public class WordUtil {// 定义静态的文件后缀public static final String SUFFIX_DOC = ".doc";public static final String SUFFIX_DOCX = ".docx";/*** 读取 Word 入口方法,根据后缀,调用方法** @param suffix   文件后缀* @param filePath 文件路径* @return*/public static String readWord(String suffix, String filePath) {String wordStr = "";try (InputStream input = new FileInputStream(filePath)) {// docx 类型if (SUFFIX_DOCX.equals(suffix)) {wordStr = readDocx(input);// doc 类型} else if (SUFFIX_DOC.equals(suffix)) {wordStr = readDoc(input);}} catch (Exception e) {log.error("readWord [{}] is error", filePath);}wordStr = wordStr.replace("\n", "");wordStr = wordStr.replace("\\\\r", "");wordStr = wordStr.replace("\\\\t", "");return wordStr;}/*** 读取 doc 类型,使用 WordExtractor 对象,传递输入流** @param inputStream* @return*/private static String readDoc(InputStream inputStream) {try {String content = "";WordExtractor ex = new WordExtractor(inputStream);content = ex.getText();ex.close();return content;} catch (Exception e) {return null;}}/*** 读取 docx 类型,使用 XWPFDocument 对象,传递输入流** @param inputStream* @return*/private static String readDocx(InputStream inputStream) {try {String content = "";XWPFDocument xdoc = new XWPFDocument(inputStream);XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);content = extractor.getText();extractor.close();return content;} catch (Exception e) {return null;}}
}

第四步:PDF解析类


@Slf4j
public class PDFToWordUtil {/*** @Description: 提取pdf中的文字 第一种方法* @Param: fileUrlList:地址* @Param: pages:页码* @return: content:提取的文字*/public static String PDFToWord(String fileUrlList) throws IOException {//linux---start---fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);//linux--end----Integer pages = PDFToPage(fileUrlList);String fileName = fileUrlList;//源文件的位置PdfReader reader = null;//PDF读取器reader = new PdfReader(fileName);String content = "";for (int i = 1; i <= pages; i++) {content += PdfTextExtractor.getTextFromPage(reader, i); // 读取PDF中第i页(用哪一页就写几)的文档内容,并转成String}content = content.replace("\n", "");content = content.replace("\\\\r", "");content = content.replace("\\\\t", "");log.debug(content);//控制台打印PDF第一页的内容return content;}/*** @Description: 提取pdf中的页码* @Param: fileUrlList:地址* @return: pages:页码数*/public static int PDFToPage(String fileUrlList) {//linux---start---fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);//linux--end----File file = new File(fileUrlList);PdfReader pdfReader = null;try {pdfReader = new PdfReader(new FileInputStream(file));} catch (IOException e) {e.printStackTrace();}int pages = pdfReader.getNumberOfPages();log.debug("pdf文件的总页数为:" + pages);return pages;}/*** @Description: 提取pdf中的文字 第二种方法* @Param: pdfPath:地址* @return: content:提取的文字*/public static String getTextFromPdf(String pdfPath) {String content = null;try {// 是否排序boolean sort = false;// 开始提取页数int startPage = 1;// 结束提取页数int endPage = Integer.MAX_VALUE;//InputStream input = null;//linux---start---// pdfPath = pdfPath.replaceAll("\\\\", File.separator);//linux--end----File pdfFile = new File(pdfPath);PDDocument document = null;try (InputStream input = new FileInputStream(pdfFile)) {// 加载 pdf 文档PDFParser parser = new PDFParser(input);parser.parse();document = parser.getPDDocument();// 获取内容信息PDFTextStripper pts = new PDFTextStripper();pts.setSortByPosition(sort);endPage = document.getNumberOfPages();log.debug("Total Page: " + endPage);pts.setStartPage(startPage);pts.setEndPage(endPage);try {content = pts.getText(document);} catch (Exception e) {throw e;}log.debug("Get PDF Content ...");} catch (Exception e) {throw e;} finally {if (null != document)document.close();}content = content.replace("\n", "");content = content.replace("\\\\r", "");content = content.replace("\\\\t", "");} catch (Exception e) {log.error("getTextFromPdf [{}] is error", pdfPath);}return content;}}

第五步:Txt解析类


@Slf4j
public class TxtUtil {/*** .* 获取文本内容** @return 文件内容*/public static String readTxtFile(String filePath) {String txtStr = "";try {File file = new File(filePath);if (!file.exists()) {log.error("可读文件不存在[{}]", file.getAbsolutePath());}txtStr = FileUtils.readFileToString(file, CharsetUtil.UTF_8);} catch (IOException e) {log.error("readTxtFile [{}] is error", filePath);}txtStr = txtStr.replace("\n", "");txtStr = txtStr.replace("\\\\r", "");txtStr = txtStr.replace("\\\\t", "");return txtStr;}/*** .* 写入数据** @param outPath 输出路径* @param context 内容*/public static void writeFile(String outPath, String context) {try {File file = new File(outPath);FileUtils.write(file, context, CharsetUtil.UTF_8, false);} catch (IOException e) {log.error("writeFile is error {}", e);}}
}

总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python开发100问?

Python是什么&#xff1f;它有什么特点&#xff1f;Python的历史是什么样的&#xff1f;Python有哪些应用领域&#xff1f;Python的基本数据类型有哪些&#xff1f;Python中的变量命名规则是什么&#xff1f;如何在Python中进行注释&#xff1f;Python中的缩进是什么意思&#…

C++初学

1>思维导图 2>试编程 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream> #include<string.h> using namespace std;int main() {string str;cout <<…

Hive-源码分析一条hql的执行过程

一、源码下载 下面是hive官方源码下载地址&#xff0c;我下载的是hive-3.1.3&#xff0c;那就一起来看下吧 https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-src.tar.gz 二、上下文 <Hive-源码带你看hive命令背后都做了什么>博客中已经讲到了hive命令执行…

消息队列中间件

1.什么是消息队列? 消息队列&#xff0c;我们一般称为MQ&#xff08;Message Queue&#xff09;。 很多初学者认为MQ通过消息的发送和接受来实现程序的异步和解耦&#xff0c;但是实际上MQ的主要目的是通讯。 MQ定义了发送者为生产者&#xff0c;接收消息的那一方为消费者。…

网络工程师笔记11

OSPF协议 priority越大越优先&#xff0c;缺省值是1&#xff0c;范围是0-255 routerID越大越优先&#xff0c;先比较优先值&#xff0c;后比较RouterID 非骨干区域必须要跟骨干区域相连&#xff0c;非骨干区域不能直接通信&#xff0c;必须经过骨干区域 OSPF配置 配置routerID划…

20240308-使用VS2022编译VLD-v2.5.4内存泄漏工具

20240308-使用VS2022编译VLD-v2.5.4内存泄漏工具 一、软件环境 Win10 x64 22h2 JuneVS2022 v17.9.0GIT v2.29.2标签&#xff1a;win10 22h2 vs2022分栏&#xff1a;C 二、硬件环境 Win10 x64的PC台式机 三、获取源码 方法一 git clone https://gitee.com/gdnh22/vld254.…

解决 Webpack 中 ERROR in main Module not found: Error: Can‘t resolve ‘./src‘ 问题

出自 BV1MN411y7pw&#xff0c; P98 黑马AJAX-Node.js-Webpack教学视频中webpack部分&#xff0c;打包的时候出错 ERROR in main Module not found: Error: Cant resolve ./src in V:\Web\mycode\webpack\01_webpack_use resolve ./src in V:\Web\mycode\webpack\01_webpack_us…

探秘Nutch:揭秘开源搜索引擎的工作原理与无限应用可能(一)

本系列文章简介&#xff1a; 本系列文章将带领大家深入探索Nutch的世界&#xff0c;从其基本概念和架构开始&#xff0c;逐步深入到爬虫、索引和查询等关键环节。通过了解Nutch的工作原理&#xff0c;大家将能够更好地理解搜索引擎背后的原理&#xff0c;并有能力利用Nutch构建…

买瓜(dfs+剪枝)

题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜&#xff0c;每个瓜的重量为 Ai 。 小蓝刀功了得&#xff0c;他可以把任何瓜劈成完全等重的两份&#xff0c;不过每个瓜只能劈一刀。 小蓝希望买到的瓜的重量的和恰好为 m 。 请问小蓝至少要劈多少个瓜才能买到重量恰好…

数据结构——二叉树的遍历【前序、中序、后序】

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

单链表详解(如何实现单链表)

文章目录 前言 一、单链表是什么&#xff1f;二、单链表的实现总结 顺序表的缺点 1.中间/头部的插入删除&#xff0c;时间复杂度为O (N) 2.realloc 扩容&#xff08;特别是异地扩&#xff0c;需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间&#xff09;会有不小的…

多场成像,快速提高机器视觉检测能力--51camera

多阵列CMOS传感器与芯片级涂层二向色滤光片相结合&#xff0c;可在单次扫描中同时捕获明场、暗场和背光图像。 多场成像是一种新的成像技术&#xff0c;它可以在不同的光照条件下同时捕获多幅图像。再加上时间延迟积分(TDI)&#xff0c;这种新兴的成像技术可以克服许多限制的传…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及台区资源聚合功率的中低压配电系统低碳优化调度方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

java-数据结构—树

目录 树的组成 节点 度 根节点 其他组成部分 二叉树 普通二叉树 二叉查找树 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 总结 平衡二叉树 平衡二叉树的旋转机制 左旋 右旋 需要旋转的四种情况 左左 左右 右右 右左 总结 红黑树 树的组成 节点…

【图(2)】:图的广度优先遍历和深度优先遍历

目录 图的遍历 一、图的广度优先遍历&#xff08;bfs&#xff09; 二、图的深度优先遍历 图的遍历 给定一个图G和其中任意一个顶点v0&#xff0c;从v0出发&#xff0c;沿着图中各边访问图中的所有顶点&#xff0c;且每个顶点仅被遍历一次。"遍历"即对结点进行某种…

MySQL 8.0 的执行计划(EXPLAIN)

MySQL 8.0 的执行计划&#xff08;也称为“EXPLAIN”计划&#xff09;是数据库优化器为 SQL 查询生成的步骤序列。解读执行计划可以帮助数据库管理员&#xff08;DBA&#xff09;和开发者理解查询如何执行&#xff0c;识别潜在的性能问题&#xff0c;并据此优化查询。 下面是如…

一、实战前的准备

目录 系列文章目录 前言 二、项目搭建 三、模块分配 总结 前言 通用后台管理系统使用vue2&#xff0c;使用vue cli构建工具&#xff0c;同时还会使用到element-ui框架进行页面布局&#xff0c;实现顶部导航菜单与左侧导航联动。下面先从三个方面介绍一下通用后台管理的核心…

C++初阶:模板

目录 一.泛型编程 二.函数模板 2.1.函数模板的概念 2.2.函数模板的格式 2.3.函数模板的原理 2.4.函数模板的实例化 隐式实例化 显示实例化 2.5.模板参数的匹配原则 三.类模板 3.1.类模板的格式 3.2.类模板的实例化 3.3.在类模板外部定义成员函数 四.非类型模板参…

系统设计学习(一)分布式系统

分布式系统 CAP 理论 CAP 理论是分布式系统设计中的一个基本原则&#xff0c;它提供了一个思考和权衡一致性、可用性和分区容错性之间关系的框架。 CAP 理论的三个要素如下&#xff1a; 一致性&#xff08;Consistency&#xff09;&#xff1a;在分布式系统中的多个副本或节…

【保姆级】Protobuf详解及入门指南

目录 Protobuf概述 什么是Protobuf 为什么要使用Protobuf Protobuf实战 环境配置 创建文件 解析/封装数据 附录 AQin.proto 完整代码 Protobuf概述 什么是Protobuf Protobuf&#xff08;Protocol Buffers&#xff09;协议&#x1f609; Protobuf 是一种由 Google 开…