哈哈,出差这么久终于回来了,回家的感觉真好!
PowerDesigner的物理数据库一出来,设计文档中要改的字段就多得不计其数,如果要把PowerDesigner中的字段一个个Copy到设计文档中,那将会是一件非常痛苦的事情。于是我在项目中自己写了一个把从PowerDesigner的物理数据库中复制出来的字段转换成设计文档中所需要的字段名称,用来提高修改文档的工作效率。
把代码发上来与大家分享一下,我不太会写正则表达式,所以效率也不是很高,希望大家可以帮我完善一下代码,看看正则表达式要怎样写效率才是最高的。
因为涉及到我们的项目,所以对str.txt文件中数据库的字段进行了必要的屏蔽,希望大家可以谅解。
/*
* @(#)FileToStr.java 2010-4-28
*
* Copyright 2010 BianJing,All rights reserved.
*/
package test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 读取文本文件,将其内容转换成字符串,并用正则表达式替换获取指定的字符串。
* 该类在这里主要是对PowerDesigner或数据库中复制出来字符串进行匹配,将每行中的表字段提取出来
* 并转换成对应的字段名称或字段类型,用于编写设计文档等工作,以提高工作效率。
* 如:从PowerDesigner复制出来的一行字符串是"某某编码 XX_TYPE_CODE NVARCHAR2(64)",则
* 转换后得到的字符串是"xxTypeCode"。
* 注意:在你要用到的字符串之前的字符串中不能包含有英文字符,如果有应将其删除,
* 如:"某某ID XX_ID NVARCHAR2(32)",这里需要用到的字符串是"XX_ID",所以应将"XX_ID"之前
* 的字符串"某某ID"中包含的英文("ID")删除或者将整个"某某ID"删除。
*
* @author BianJing<br/>
* E-mail: [email protected]
* @version 2010-4-28
*/
public class FileToStr {
// 模式一
private static Pattern p1 = Pattern.compile("([\\w])([\\w]+)");
// 模式二
private static Pattern p2 = Pattern.compile("(.*)_([a-z])(.*)");
// 测试
public static void main(String[] args) {
String str = fileToStr("test/str.txt");
System.out.println(str);
}
/**
* 将文本文件转换成字符串
* @param filePath 文本文件完整的包路径
* @return 文本文件的字符表示形式
*/
public static String fileToStr(String filePath){
StringBuffer fileStr = null;
Reader reader = null;
BufferedReader bufReader = null;
try {
String realPath = getRealPath(filePath);
// 将文本文件封装到IO字符流中
reader = new FileReader(realPath);
bufReader = new BufferedReader(reader);
String str = null;
fileStr = new StringBuffer();
// 读取文本文件
while ((str = bufReader.readLine()) != null) {
// 查找与模式一相匹配的字符串
Matcher m1 = p1.matcher(str);
if (m1.find()) {
// 将查找到的第一组字符串转换成小字字母,如果首字母要大写则这里就不要调 toLowerCase()
String tempStr1 = m1.group(1).toLowerCase();
// 将查找到的第二组字符串转换成小字字母
String tempStr2 = m1.group(2).toLowerCase();
str = tempStr1 + tempStr2;
}
str = transform(str);
fileStr.append(str);
fileStr.append("\n");
}
} catch(NullPointerException e){
System.out.println("路径[" + filePath + "]无效!");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bufReader != null){
try {
bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}
bufReader = null;
}
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
reader = null;
}
}
if(fileStr != null)
return fileStr.toString();
else
return null;
}
/**
* 返回文本文件的真实物理路径
* @param filePath 文本文件完整的包路径
* @return 文本文件的物理路径
* @throws NullPointerException
*/
private static String getRealPath(String filePath) throws NullPointerException{
String realPath = FileToStr.class.getClassLoader().getResource(filePath).getFile();
realPath = realPath.replaceFirst("/", "");
// 如果URL地址中含有空格,则空格会被"%20"替换,所以要将它替换回来
realPath = realPath.replaceAll("%20", " ");
return realPath;
}
/**
* 查找与模式二相匹配的字符串,并将得到的字符串进行组合
* @param str
* @return str
*/
private static String transform(String str){
// 查找与模式二相匹配的字符串
Matcher m2 = p2.matcher(str);
if (m2.find()) {
String tempStr1 = transform(m2.group(1));
String tempStr2 = transform(m2.group(2));
String tempStr3 = transform(m2.group(3));
str = tempStr1 + tempStr2.toUpperCase() + tempStr3;
}
return str;
}
}
str.txt文件的内容:
某某编码 XX_TYPE_CODE NVARCHAR2(64) 64 FALSE FALSE TRUE
某某名称 XX_NAME NVARCHAR2(64) 64 FALSE FALSE TRUE
某某序号 XX_NO NUMBER(4) 4 FALSE FALSE TRUE
某某类型 XX_TYPE_CODE NVARCHAR2(64) 64 FALSE FALSE FALSE
某某信息 XX_INFO NVARCHAR2(200) 200 FALSE FALSE FALSE
某某标签 XX_LABEL NVARCHAR2(200) 200 FALSE FALSE FALSE
高度 HEIGHT NUMBER(5,2) 5 2 FALSE FALSE TRUE
宽度 WIDTH NUMBER(5,2) 5 2 FALSE FALSE FALSE
深度 DEPTH NUMBER(5,2) 5 2 FALSE FALSE FALSE
某某方式 XX_WAY_CODE NVARCHAR2(64) 64 FALSE FALSE FALSE
位置 POSITION NVARCHAR2(200) 200 FALSE FALSE FALSE
某某图形 XX_IMAGE NVARCHAR2(200) 200 FALSE FALSE FALSE
某某原因 XX_REASON NVARCHAR2(200) 200 FALSE FALSE FALSE
备注 REMARK NVARCHAR2(1000) 1000 FALSE FALSE FALSE