java 如何读取解析 mac 下的 pages 文稿,实现数据库正向工程

简介: 版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/80768968 mac下使用 pages 文稿编写的数据库设计文档,虽然 mac 下也有 word,但还是习惯用 pages,感觉它要比 word 开启的速度快一些,使用起来也挺方便的。
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/80768968

mac下使用 pages 文稿编写的数据库设计文档,虽然 mac 下也有 word,但还是习惯用 pages,感觉它要比 word 开启的速度快一些,使用起来也挺方便的。那使用 pages 设计了数据库表结构之后,又不想一个一个字段的去创建数据表结构,所以想到了 java如何读取解析mac下的pages文稿,实现数据库正向工程;这里的正向工程就是生成 SQL 建表语句。


Pages 文稿

Pages 文稿是一款功能强大的文字处理软件,让你能够制作精美的文档。你甚至能使用 Apple Pencil 在你的 iPad 上添加手写备注和手绘插图。利用实时协作功能,你的团队成员可以共同协作,不论他们使用 Mac、iPad、iPhone,
还是使用 PC。原文:https://blog.csdn.net/testcs_dn/article/details/80768968

实现步骤

java 是不能直接读取解析 pages 文稿的,有的文章提到在 Windows 下查看 pages 文稿的方法是把扩展名改为 tar ,然后把它解压出来,会提到PDF文件,直接打开就能看到文件中的内容啦,但是这个我试过,看到的内容很不清楚,而且不能编辑。

上面提到 mac 下也有 word,所以先导致为 word,选择 docx 格式


然后再使用 word 的另存为网页的功能(为什么这样做?其实 java 解析 word 也是比较麻烦的,个人感觉)



这样我们就得到了 htm 格式的文件,如果你写过爬虫,相信接下来就明白怎么做了吧!

我选择使用 Jsoup 框架。

上代码:原文:https://blog.csdn.net/testcs_dn/article/details/80768968

package com.weixiao;

import java.io.File;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 读取网页中的表格,生成建表语句
 * BuildCreateSQL
 * @author lipw
 * @date   2018年6月22日上午9:55:34
 */
public class BuildCreateSQL {

	public static void doCreateSQL(String fileName){
		File file = new File(fileName);
		
		Document doc = null;
		if (file.exists()) {
			try {
				// 解析网页,默认为 gbk 编码
				doc = Jsoup.parse(file, "gbk");
				
				// 选择网页中的表格元素,这里使用与 Jquery 兼容的 Selector 格式
				Elements tableElements = doc.select("body > div > table");
				int tableCount = 0;
				for (Element eleTable : tableElements){
					// 我的文档中第一个表是修订历史表,所以过滤掉
					if (tableCount == 0){
						tableCount+=1;
						continue;
					}
					
					// 不考虑性能,所以直接使用 String
					String sql = "";
					String tableComment = "";
					
					Elements trElements = eleTable.select("tr");
					for (Element eleTr : trElements){
						// 根据上图表结构看到的,第一行是表名,第二行是备注,只有两列
						Elements tdElements = eleTr.select("td");
						if (tdElements.size() == 2){
							if (sql.length() == 0){
								sql = "DROP TABLE IF EXISTS `" + tdElements.get(1).text().toLowerCase() + "`;\r\n";
								sql += "CREATE TABLE `" + tdElements.get(1).text().toLowerCase() + "` (\r\n";
							}else{
								tableComment = tdElements.get(1).text();
							}
						}
						// 定义字段的行有8列
						if (tdElements.size() == 8){
							// 判断是否为空行或表头行
							if (!tdElements.get(1).text().isEmpty() && !"字段".equals(tdElements.get(1).text())){
								sql += "  `" + tdElements.get(1).text().toLowerCase() + "` ";
								
								// 处理数据类型
								switch (tdElements.get(2).text().toLowerCase()){
								case "bigint":
									sql += "bigint(20)";
									break;
								case "int":
									sql += "int(11)";
									break;
								case "decimal":
									sql += "decimal" + tdElements.get(3).text();
									break;
								case "varchar":
									sql += "varchar(" + tdElements.get(3).text() + ")";
									break;
								case "bit":
									sql += "bit";
									break;
								case "tinyint":
									sql += "tinyint";
									break;
								case "datetime":
									sql += "datetime";
									break;
								case "date":
									sql += "date";
									break;
								case "time":
									sql += "time";
									break;
								case "text":
									sql += "text";
									break;
								case "blob":
									sql += "blob";
									break;
									default:
										break;
								}
								
								// 是否允许为空
								if ("N".equals(tdElements.get(5).text()) || "不为空".equals(tdElements.get(1).text())){
									sql += " NOT NULL";
								}
								
								// 是否为自增字段
								if ("自增".equals(tdElements.get(7).text())){
									sql += " AUTO_INCREMENT";
								}
								
								// 处理注释
								sql += " COMMENT '" + tdElements.get(4).text();
								if (!tdElements.get(7).text().isEmpty()){
									sql += ";" + tdElements.get(7).text();
								}
								sql +=  "',\r\n";
							}
						}
					}
					
					// 处理主键,设计规则中默认 id 为主键
					sql += "  PRIMARY KEY (`id`)\r\n";
					// 处理表的引擎、编码、注释等信息
					sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='" + tableComment + "';";
					
					System.out.println("");
					System.out.println("");
					System.out.println(sql);
				}

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Throwable e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		doCreateSQL("/Users/aven/gswd/网站/网站数据库设计_v1.0.htm");
	}

}

生成效果:原文:https://blog.csdn.net/testcs_dn/article/details/80768968

DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号;自增',
  `user_type` int(11) COMMENT '用户类型;0=未知',
  `user_id` bigint(20) COMMENT '用户编号',
  `operation` int(11) COMMENT '操作类型',
  `content` varchar(2000) COMMENT '日志内容',
  `create_time` datetime COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='日志表';

小结 原文:https://blog.csdn.net/testcs_dn/article/details/80768968

其实应该使用 PowerDesigner、Rational Rose、Visio 等建模工具来设计数据库的,然后是基于它们的正向工程。在 windows 下习惯使用 Visio,但 Visio 好像只有一个 2005 企业版有正向工程的功能,我也没有找到亲测可用的版本。所以一般是设计文档,然后建表,再反向工程,生成关系图。

这里使用 pages,word 自带的格式转换功能,实现了自己想要的结果;

有时候想到达到目的,就是需要学会拐弯抹角,正所谓好事多磨。


目录
相关文章
|
29天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
169 0
|
30天前
|
消息中间件 存储 数据库
RocketMQ 流数据库解析:如何实现一体化流处理?
RocketMQ 5.0 是一款云原生的消息中间件,旨在覆盖更多业务场景。它针对国内企业在数字化转型中面临的多场景消息处理需求,提供了一体化的解决方案。
111908 7
|
1月前
|
存储 监控 关系型数据库
数据库核心术语解析与应用
数据库核心术语解析与应用
61 0
|
3月前
|
存储 缓存 关系型数据库
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
阿里云RDS率先推出新型存储类型通用云盘,提供低延迟、低成本、高持久性的用户体验。
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
|
3月前
|
算法 关系型数据库 MySQL
【MySQL 解析】数据库的乐观锁和悲观锁实现原理
【1月更文挑战第11天】【MySQL 解析】数据库的乐观锁和悲观锁实现原理
|
13天前
|
存储 中间件 关系型数据库
数据库切片大对决:ShardingSphere与Mycat技术解析
数据库切片大对决:ShardingSphere与Mycat技术解析
21 0
|
2天前
|
SQL druid Java
Javaweb之数据库连接池以及lombok类库的详细解析
Javaweb之数据库连接池以及lombok类库的详细解析
11 0
|
2天前
|
SQL 存储 关系型数据库
数据库开发之图形化工具以及表操作的详细解析
数据库开发之图形化工具以及表操作的详细解析
16 0
|
2天前
|
SQL 存储 关系型数据库
数据库开发之mysql前言以及详细解析
数据库开发之mysql前言以及详细解析
10 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 文件管理】Linux 更新locate命令所使用的数据库 updatedb命令解析
【Shell 命令集合 文件管理】Linux 更新locate命令所使用的数据库 updatedb命令解析
155 0