且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-05-17 11:50:16

版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用***转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/80768968

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

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

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 格式

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

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

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

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

这样我们就得到了 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 自带的格式转换功能,实现了自己想要的结果;

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