当前位置: 首页 > news >正文

Java提取markdown中的表格

Java提取markdown中的表格

说明

这篇博文是一个舍近求远的操作,如果只需要要对markdown中的表格数据进行提取,完全可以通过正在表达式或者字符串切分来完成。但是鉴于学习的目的,这次采用了commonmark包中的工具来完成。具体实现过程如下

实现步骤

引入pom依赖

		<dependency><groupId>org.commonmark</groupId><artifactId>commonmark</artifactId><version>0.21.0</version></dependency><dependency><groupId>org.commonmark</groupId><artifactId>commonmark-ext-gfm-tables</artifactId><version>0.21.0</version></dependency>

自定义vistor

import org.commonmark.ext.gfm.tables.*;
import org.commonmark.node.*;import java.util.ArrayList;
import java.util.List;public class TableVisitor extends AbstractVisitor {private boolean inHeader = false;private boolean inBody = false;private List<String> currentRow = null;private List<String> headers = new ArrayList<>();private final List<List<String>> rows = new ArrayList<>();@Overridepublic void visit(CustomBlock customBlock) {if (customBlock instanceof TableBlock) {handleTableBlock((TableBlock) customBlock);} else {super.visit(customBlock);}}@Overridepublic void visit(CustomNode customNode) {if (customNode instanceof TableHead) {handleTableHead((TableHead) customNode);} else if (customNode instanceof TableBody) {handleTableBody((TableBody) customNode);} else if (customNode instanceof TableRow) {handleTableRow((TableRow) customNode);} else if (customNode instanceof TableCell) {handleTableCell((TableCell) customNode);} else {super.visit(customNode);}}private void handleTableBlock(TableBlock tableBlock) {// 重置状态inHeader = false;inBody = false;visitChildren(tableBlock);}private void handleTableHead(TableHead tableHead) {inHeader = true;visitChildren(tableHead);inHeader = false;}private void handleTableBody(TableBody tableBody) {inBody = true;visitChildren(tableBody);inBody = false;}private void handleTableRow(TableRow tableRow) {currentRow = new ArrayList<>();visitChildren(tableRow);if (inHeader) {this.headers = currentRow;} else if (inBody) {this.rows.add(currentRow);}}private void handleTableCell(TableCell tableCell) {if (currentRow != null) {currentRow.add(getTextContent(tableCell));}visitChildren(tableCell);}private String getTextContent(Node node) {StringBuilder sb = new StringBuilder();Node child = node.getFirstChild();while (child != null) {if (child instanceof Text) {sb.append(((Text) child).getLiteral());}child = child.getNext();}return sb.toString().trim();}public List<String> getTableHeaders() {return headers;}public List<List<String>> getTableRows() {return rows;}
}

测试用例

public static void main(String[] args) {String content = """| 姓名       | 性别   | 班级        | 年龄          ||--------------|------|--------------------|--------------------|| 张三       |  男    |   兴趣一班                 |             17       || 李四         | 男 | 兴趣一班  | 16  |""";List<Extension> extensions = Arrays.asList(TablesExtension.create());Parser parser = Parser.builder().extensions(extensions).build();Node document = parser.parse(content);TableVisitor visitor = new TableVisitor();document.accept(visitor);List<String> tableHeaders = visitor.getTableHeaders();List<List<String>> tableRows = visitor.getTableRows();System.out.println("表头: " + tableHeaders);System.out.println("表格行数据: "+ tableRows);}

总结

由于没有在commonmark中找到我们需要的vistor,所以自定义了vistor。希望可以对其他同学有所帮助吧。

相关文章:

  • Mysql全局优化
  • 学习路之PHP--easyswoole入门及文件热加载
  • 基于 Node.js 的 Express 服务是什么?
  • 【Elasticsearch】scripted_upsert
  • 使用Mathematica绘制随机多项式的根
  • 【elasticsearch 7 或8 的安装及配置SSL 操作指引】
  • huggingface CLIP 相关模型下载与使用
  • 在 springboot3.x 使用 knife4j 以及常见报错汇总
  • QGis实现geoserver上的样式展示(方便样式编辑)
  • BSRN地表基准辐射网数据批量下载
  • MacOS内存管理-删除冗余系统数据System Data
  • STM32 Modbus RTU从机开发实战:核心实现与五大调试陷阱解析
  • Java并发编程利器:LongAdder原理解析与实战应用
  • Linux系统-基本指令(3)
  • Linux Ubuntu24.04配置安装MySQL8.4.5高可用集群主从复制!
  • Docker修改镜像存放位置
  • influxdb时序数据库
  • 图论学习笔记 5 - 最小树形图
  • 代码随想录算法训练营 Day56 图论Ⅶ 最小生成树算法 Prim Kruskal
  • 仿真环境中机器人抓取与操作 - 上手指南
  • 企业网站建设太原网站建设/2022近期时事热点素材摘抄
  • 廊坊专业网站网站/软文代写平台
  • 烟台房产网站建设/如何在百度推广自己
  • wordpress 小工具参数/广州网站优化页面
  • 加强政府门户网站建设与管理/武汉seo招聘信息
  • 企业网站建设维护合同书/国内专业seo公司