Java简单应用之去除SQL文件注释

     工作中可能有些时候需要提供Sql脚本,某些脚本中可能有注释,可以使用Java对Sql脚本做简单的处理,把Sql文件中的注释去掉。

     以Oracle脚本为例,Mysql脚本我没写,Oracle中常见注释有2种注释。

     单行注释: --
     多行注释:/**/

     只要把出现注释的地方去掉就可以了,详情见代码,代码注释写的很详细了。

    

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Sql语句处理 {
	public static void main(String[] args) throws Exception {
		Sql语句处理 t = new Sql语句处理();
		String content = new String(t.processSqlContent(
				"f:/saveFile/tmp/c/testdb.sql", "utf-8"));
		System.out.println(content);
		t.writeStrToFile(content,"f:/saveFile/tmp/c/testdb.sql", "utf-8");
	}

	public String processSqlContent(String filePath, String charSet)
			throws Exception {
		if (charSet == null) {
			charSet = "utf-8";
		}
		BufferedReader br = new BufferedReader(new InputStreamReader(
				new FileInputStream(filePath), charSet));
		StringBuffer contentBuffer = new StringBuffer(5120);
		String temp = null;
		String tmpResult = null;
		boolean isStart = false;
		while ((temp = br.readLine()) != null) {
			//去空格和;
			tmpResult = new String(temp.replaceAll(";", " ").replaceAll("\\s{2,}", " "));
			if (tmpResult != null) {
				//去除同一行/* */注释
				if(tmpResult.indexOf("/*")!=-1&&tmpResult.indexOf("*/")!=-1)
				{
					//最小匹配
					tmpResult=tmpResult.replaceAll("\\/\\*.*?\\*\\/", "");
				}else if (tmpResult.indexOf("/*") != -1&&tmpResult.indexOf("*/") == -1&&tmpResult.indexOf("--")==-1) {
					// /*开始
					isStart = true;
				}else if(tmpResult.indexOf("/*")!=-1&&tmpResult.indexOf("--")!=-1&&tmpResult.indexOf("--")<tmpResult.indexOf("/*"))
				{
					//同时存在--/*
					tmpResult=tmpResult.replaceAll("--.*", "");
				}
				if (isStart && tmpResult.indexOf("*/") != -1) {
					// */结束
					isStart = false;
					continue;
				} 
				// 去除同一行的--注释
				tmpResult = new String(tmpResult.replaceAll("--.*", ""));
			}
			if (!isStart) {
				//保留换行符
				//contentBuffer.append(tmpResult).append("\r\n");
				//无换行符
				contentBuffer.append(tmpResult);
			}
		}
		temp = contentBuffer.toString();
		//保留换行符
		//temp = new String(temp.replaceAll("\\s{2,}\\r\\n"," "));
		//无换行符
		temp = new String(temp.replaceAll("\\s{2,}", " "));
		return temp;
	}

	public String getFileContent(String fileName, String chartSet)
			throws Exception {
		if (chartSet == null) {
			chartSet = "utf-8";
		}
		StringBuffer buffer = new StringBuffer(5120);
		String line = null;
		InputStream is = new FileInputStream(fileName);
		BufferedReader reader = new BufferedReader(new InputStreamReader(is,
				chartSet));
		while ((line = reader.readLine()) != null) {
			buffer.append(line).append("\r\n");
		}
		return buffer.toString();
	}

	public void writeStrToFile(String str, String filePath, String charsetName)
			throws Exception {
		if (charsetName == null) {
			charsetName = "utf-8";
		}
		OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(
				filePath), charsetName);
		out.write(str);
		out.close();
	}
}

    测试文件:

  

select
--注释/*注释*/
 * --去全部
/*注释*/
/*测试--*/
  from emp --从emp取数据/**测试
/*
  测试注释
  --注释*/
/*--测试*/
/*多行注释*/
/**2B注释*/
/* *
   *取dept=10 日期小于1998的数据
   */
/*select *
   from emp
  where 1 = 1
    and deptno = 12
    --and hiredate < to_date('2013-10-01', 'yyyy-mm-dd')*/
 where /**/
 1 = /*注释--这也是注释*/
/*注释*/
 1 --1=1
 and deptno = /*--*/ /*注释---*/
 10 --部门
/*
    注释//嵌套注释*/
 and /*时间字段*/
 hiredate /*测试注释/*测试注释*/
 < /*日期小于1998*/
 to_date('1998-10-01', 'yyyy-mm-dd' /*年月日格式*/)

  处理结果:

 

     写的不好的地方请指出,代码写的很匆忙,如有错误也请指出,转载请注明出处。谢谢。

     全文完。

 

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值