天天看點

java 如何讀取解析 mac 下的 pages 文稿,實作資料庫正向工程

版權聲明:本文為 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 自帶的格式轉換功能,實作了自己想要的結果;

有時候想到達到目的,就是需要學會拐彎抹角,正所謂好事多磨。