oaklet 发表于 2013-1-15 03:11:26

文本处理学习笔记1

环境情况如下:
python-2.5.2
ibatis-2.3.4.726
jdk1.6.0_07
Oracle9i Enterprise Edition 9.2.0.1.0

一个简单的ibatis配置文件生成工具:
测试文件如下(test.sql):
------------------------------------------------------- Export file for user PS                         ---- Created by administrator on 2010/1/26, 10:56:19 -------------------------------------------------------spool test.logpromptprompt Creating table TAB_BSCprompt =====================promptcreate table PS.TAB_BSC(    TB_ID NUMBER(10, 0),    TB_NAME VARCHAR2(50),    TB_TIME DATE,    TB_VALUE NUMBER(10, 5))tablespace PSTBSpctfree 10initrans 1maxtrans 255storage(    initial 64K    minextents 1    maxextents unlimited);promptprompt Creating table TAB_CELLprompt ======================promptcreate table PS.TAB_CELL(    TC_ID NUMBER(10, 0),    TC_NAME VARCHAR2(50),    TC_TIME DATE,    TC_VALUE NUMBER(10, 5))tablespace PSTBSpctfree 10initrans 1maxtrans 255storage(    initial 64K    minextents 1    maxextents unlimited);spool off
生成工具的Python代码如下(ibatisGen.py):
# coding:gbkimport osimport redef ibatisxml(rawsqls):    tabs = re.findall("(create table PS.(\w+).+?;)", rawsqls, re.DOTALL)    for i in tabs:      tabU = i      cols = re.findall("(+)\s+(+)", i)      txml = ["""<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">"""]      columnStr = ",\n".join(["""%s"""%j for j in cols])      valueStr = ",\n".join(["""#%s#"""%j for j in cols])      txml.append("""<sqlMap namespace="%(tabU)s"><typeAlias alias="%(tabU)s" type="com.test.beans.%(tabU)s"/><select id="selectSource%(tabU)s" parameterClass="%(tabU)s" resultClass="%(tabU)s">    <!]></select><insert id="insertTarget%(tabU)s" parameterClass="%(tabU)s">    <!]></insert><delete id="deleteTarget%(tabU)s" parameterClass="%(tabU)s">    <!]></delete></sqlMap>"""%locals())      if not os.path.exists("ibatisxml"):            os.makedirs("ibatisxml")      ofile = file("ibatisxml/%s.xml"%i, "w")      ofile.write("\n".join(txml))      ofile.close()def javaclass(rawsqls):    tabs = re.findall("(create table PS.(\w+).+?;)", rawsqls, re.DOTALL)    for vv in tabs:      tabU = vv      tclass = []      cols = re.findall("(+)\s+(+)", vv)      tclass.append("""package com.test.beans;import java.io.Serializable;import java.math.BigDecimal;import java.sql.Timestamp;public class %(tabU)s implements Serializable {    private static final long serialVersionUID = 1L;"""%locals())      for iv, cv in enumerate(cols):            colU = cv            colL = cv.capitalize()            colT = "String"            if cv=="TIMESTAMP" or cv=="DATE":                colT = "Timestamp"            elif cv=="INTEGER" or cv=="FLOAT" or cv=="NUMBER":                colT = "BigDecimal"            tclass.append("""    public %(colT)s get%(colU)s() {      return %(colU)s;    }    public void set%(colU)s(%(colT)s %(colL)s) {      %(colU)s = %(colL)s;    }"""%locals())      for iv, cv in enumerate(cols):            colU = cv            colL = cv.capitalize()            colT = "String"            if cv=="TIMESTAMP" or cv=="DATE":                colT = "Timestamp"            elif cv=="INTEGER" or cv=="FLOAT" or cv=="NUMBER":                colT = "BigDecimal"            tclass.append("""    public %(colT)s %(colU)s;"""%locals())      tclass.append("}")      if not os.path.exists("javaclass"):            os.makedirs("javaclass")      ofile = file("javaclass/%s.java"%tabU, "w")      ofile.write("\n".join(tclass))      ofile.close()ifile = file("test.sql", "r")rsql = ifile.read()ifile.close()ibatisxml(rsql)javaclass(rsql)

来看看测试结果吧,
ibatisxml文件夹中生成两个文件:

(TAB_BSC.xml):
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"><sqlMap namespace="TAB_BSC"><typeAlias alias="TAB_BSC" type="com.test.beans.TAB_BSC"/><select id="selectSourceTAB_BSC" parameterClass="TAB_BSC" resultClass="TAB_BSC">    <!]></select><insert id="insertTargetTAB_BSC" parameterClass="TAB_BSC">    <!]></insert><delete id="deleteTargetTAB_BSC" parameterClass="TAB_BSC">    <!]></delete></sqlMap>

(TAB_CELL.xml):
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"><sqlMap namespace="TAB_CELL"><typeAlias alias="TAB_CELL" type="com.test.beans.TAB_CELL"/><select id="selectSourceTAB_CELL" parameterClass="TAB_CELL" resultClass="TAB_CELL">    <!]></select><insert id="insertTargetTAB_CELL" parameterClass="TAB_CELL">    <!]></insert><delete id="deleteTargetTAB_CELL" parameterClass="TAB_CELL">    <!]></delete></sqlMap>

javaclass文件夹中也生成了两个文件:

(TAB_BSC.java):
package com.test.beans;import java.io.Serializable;import java.math.BigDecimal;import java.sql.Timestamp;public class TAB_BSC implements Serializable {    private static final long serialVersionUID = 1L;    public BigDecimal getTB_ID() {      return TB_ID;    }    public void setTB_ID(BigDecimal Tb_id) {      TB_ID = Tb_id;    }    public String getTB_NAME() {      return TB_NAME;    }    public void setTB_NAME(String Tb_name) {      TB_NAME = Tb_name;    }    public Timestamp getTB_TIME() {      return TB_TIME;    }    public void setTB_TIME(Timestamp Tb_time) {      TB_TIME = Tb_time;    }    public BigDecimal getTB_VALUE() {      return TB_VALUE;    }    public void setTB_VALUE(BigDecimal Tb_value) {      TB_VALUE = Tb_value;    }    public BigDecimal TB_ID;    public String TB_NAME;    public Timestamp TB_TIME;    public BigDecimal TB_VALUE;}

(TAB_CELL.java):
package com.test.beans;import java.io.Serializable;import java.math.BigDecimal;import java.sql.Timestamp;public class TAB_CELL implements Serializable {    private static final long serialVersionUID = 1L;    public BigDecimal getTC_ID() {      return TC_ID;    }    public void setTC_ID(BigDecimal Tc_id) {      TC_ID = Tc_id;    }    public String getTC_NAME() {      return TC_NAME;    }    public void setTC_NAME(String Tc_name) {      TC_NAME = Tc_name;    }    public Timestamp getTC_TIME() {      return TC_TIME;    }    public void setTC_TIME(Timestamp Tc_time) {      TC_TIME = Tc_time;    }    public BigDecimal getTC_VALUE() {      return TC_VALUE;    }    public void setTC_VALUE(BigDecimal Tc_value) {      TC_VALUE = Tc_value;    }    public BigDecimal TC_ID;    public String TC_NAME;    public Timestamp TC_TIME;    public BigDecimal TC_VALUE;}

JavaBean的生成稍微偷了下懒,
使用 Timestamp 接所有的时间,
使用 BigDecimal 接所有的数字,
幸好 java支持这样做,jdbc支持得也不错。
以后用ibatis时可以先导一份表结构,
根据表结构可以生成配置文件,生成JavaBean,
方便了。
页: [1]
查看完整版本: 文本处理学习笔记1