關係錶轉dooris 的java 指令碼

mcxiaoracle發表於2024-01-19
package sql;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
	public static void main(String[] args) throws IOException {
		genFile();
		convert();
	}
	private static void genFile() throws IOException {
		// 指定要建立或開啟的檔案路徑及名稱
		String filePath2 = "E:\\XXXX\\ct.sql"; // 指定要讀取的檔案路徑
		BufferedReader reader = new BufferedReader(new FileReader(filePath2));
		File file = new File("E:\\\\\\\\XXXX\\\\\\\\doc\\\\\\\\temp.sql");
		
		
		
		if (file.exists()) { // 判斷檔案是否存在
			file.delete(); // 刪除檔案
		} else { // 檔案不存在
			System.out.println(file.createNewFile()); // 建立新檔案
		}
		String line;
		while ((line = reader.readLine()) != null) {
			System.out.println(line); // 輸出每一行內容
			// 在這裡進行其他操作或邏輯判斷等
//			Pattern pattern = Pattern.compile("\\((.*?)\\)");
			Pattern pattern = Pattern.compile("\\((.*?)\\)");
			Matcher matcher = pattern.matcher(line);
			String key = null;
			if (line.startsWith("CREATE")) {
				String[] data1 = line.split(" ");
				String name = data1[2];
				if (name.contains(".")) {
					String[] names = name.split("\\.");
					 String tableName = names[1];
					 String tableNames = "`" + tableName.trim() + "`";
					line = line.replace(names[0] + ".", ""); //去除表名
					line=line.replace(tableName, tableNames);
				}
			}
			// 加引號
			String[] data = line.split(" ");
			String filed = data[0];
			if (filed.length() > 0 && !filed.startsWith("--") && !filed.startsWith("CREATE")
					&& !filed.startsWith(")") && !filed.endsWith("COMMENT")) {
				String filednew = "`" + filed.trim() + "`";
				line = line.replace(filed, filednew);
			}
			// 判斷varchar(轉換varchar2(
			if (line.contains("varchar(")) {
				line = line.replace("varchar(", "varchar2(");
			}
			
			
			if(line.contains("int4")) {
				line = line.replace("int4", "int(4)");
				
			}
			
			//byte
			if(line.contains("bytea")) {
				line = line.replace("bytea", "text");
			}
			
			
			// timestamp 改為 datetime
			if (line.contains("timestamp")) {
//				line = line.replace("timestamp", "datetime");
				 String[] result = line.split(" ");
				 if(result[1].contains("timestamp")) {
					 line = line.replace(result[1], "datetime");
				 }
				 
			}
			// numeric(->decimal(
			if (line.contains("numeric")) {
				line = line.replace("numeric", "decimal");
			}
			// bpchar->char
			if (line.contains("bpchar")) {
				line = line.replace("bpchar", "char");
			}
			if (line.contains("PRIMARY")) {
				while (matcher.find()) {
					System.out.println("獲取數值=" + matcher.group().replace("(", "").replace(")", ""));
					key = matcher.group().replace("(", "").replace(")", "");
				}
				// 1.最後追加
				line = "";
				line = " ";
				line += ")\n";
				line += "unique key(" + key + ")" + "  DISTRIBUTED BY HASH(" + key + ") BUCKETS 16"
						+ "  PROPERTIES(\"replication_num\" = \"3\");";
				
				
			} else {
				// 獲取數值*3
				while (matcher.find()) {
					System.out.println("獲取數值=" + matcher.group().replace("(", "").replace(")", ""));
					key = matcher.group().replace("(", "").replace(")", "");
					if (isNumber(key)) {
						int keyInt = Integer.parseInt(key) * 3;
						line = line.replace(key, "" + keyInt);
					} else {
					}
				}
			}
			
			
			if (line.startsWith(")")) {
				line = "";
			}
			if (line.startsWith("COMMENT")) {
				line = "";
			}
			
			//包含索引
			if(line.startsWith("CREATE INDEX")) {
				line=" ";
			}
			try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, true))) {
				if (!(line.isBlank() || line.isEmpty())) {
					// 向檔案寫入資料
					// 過濾
					if (line != null) {
						writer.write(line);
						writer.write("&");
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	public static boolean isNumber(String str) {
		return str.matches("\\d+");
	}
	public static void convert() throws IOException {
		// 指定要建立或開啟的檔案路徑及名稱
		String filePath = "E:\\01XXXX\\doc\\temp.sql";
		BufferedReader reader = new BufferedReader(new FileReader(filePath));
		File file = new File("E:\\0XXXXXXX\\doc\\doris.sql");
		if (file.exists()) { // 判斷檔案是否存在
			file.delete(); // 刪除檔案
		} else { // 檔案不存在
			System.out.println(file.createNewFile()); // 建立新檔案
		}
		String line;
		while ((line = reader.readLine()) != null) {
			System.out.println(line); // 輸出每一行內容
			int lastCommaIndex = line.lastIndexOf(","); // 獲取最後一個逗號的索引位置
			// 建立 StringBuilder 物件並將原始字串賦值給它
			StringBuilder sb = new StringBuilder(line);
			if (lastCommaIndex >= 0 && lastCommaIndex < sb.length()) {
				// 呼叫 deleteCharAt() 方法刪除指定索引位置的字元
				sb.deleteCharAt(lastCommaIndex);
				System.out.println("刪除後的字串為:" + sb.toString());
				String result = sb.toString().replace("&", "\n");
				try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, Charset.forName("UTF-8"), true))) {
					if (!(line.isBlank() || line.isEmpty())) {
						// 向檔案寫入資料
						// 過濾
						if (line != null) {
							writer.write(result);
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				System.out.println("無效的索引");
			}
		}
	}
	
	//記得最後要更改為varchar
}



以上很容易將對應的普通的表結構轉化為dris 可以識別的表插入資料。



參考資料:

  1. https://cloud.tencent.com/developer/article/2055323

  2. https://blog.csdn.net/be_racle/article/details/133877785

  3. https://blog.csdn.net/be_racle/article/details/133877785





來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/69949806/viewspace-3004521/,如需轉載,請註明出處,否則將追究法律責任。