您的位置:首页 > 数据库

利用groovy把表中数据导出成txt或csv

2008-09-01 16:05 92 查看
胶水语言就是胶水,写起也挺快的.这个脚本主要是从数据库中把表中的数据导出来生成文件.而不用每次都打开数据库编辑器去手工收集.然后结合强大的脚本(shell,bat)等基本就可以实现定时生成最新数据文本了.

目前这个groovy脚本只要输入sql语句,便会自动去反射表中的字段和类型.
脚本名称:export.groovy
import groovy.sql.Sql;

try
{
if(this.args.size()<1)
{
    println "格式错误!请参照下面的正确格式"
    println "export [sql:可以正确执行的sql语句]"
    return;
}
}
catch (Exception e)
{
    println "格式错误!请参照下面的正确格式"
    println "export [sql:可以正确执行的sql语句]"
    return;

}

/*
连接对象
可以根据你自己的需要调整
*/
sql = Sql.newInstance("jdbc:oracle:thin:@10.220.51.40:1521:ORA10G","用户名","密码","oracle.jdbc.driver.OracleDriver");

/* SQL语句 可以根据自己需要调整*/
strSql=this.args[0];
//方法_获取表名
def getTableName={strSql->
 pattern= ~"FROM .*"
 matcher = strSql.toUpperCase()  =~ pattern
 tableName="";
 while(matcher.find()){
     tableName= matcher.group()
 }
 return tableName.split(' ')[1];
}

//方法判断字符串里面是否有中文
def isChinaese={ str->  
 if(str==null)
     return;
    
 for (i in 0..str.size()-1)
 {
    if(str.charAt(i)>127)
    {
        return true;
    }
 } 
  return false;
}

def file_tableName=getTableName(strSql);//表名
def result_columnCount=0;//列数
def result_columnName=[];//列名
def result_columnType=[];//列类型
def result_rowsData=[];//行数据
def rows_count=0;

//在该脚本的同级目录下生成已表名命名的csv文件
file_csv= new File("${file_tableName}.txt");

//判断文件是否存在,如果存在写删除
if(file_csv.exists()){
println "在当前目录下发现已经存在${file_tableName},程序已经删除文件"
    file_csv.delete()
}

println "准备生成${file_tableName}.csv"
sql.eachRow(strSql,
    {
        result_columnCount= it.getColumnCount();        
        
        println "*********${file_tableName}表结构**********"
        println ":本次导出共生成${result_columnCount}个字段";
        for (i in 1..result_columnCount){  //不同与java,groovy下标从1开始          
            println    it.getColumnName(i) +"   |    "+ it.getColumnTypeName(i) ;   
            result_columnName<<it.getColumnName(i);
            result_columnType<<it.getColumnTypeName(i);           
        }
        println "*********${file_tableName}表结构**********"
        file_csv<<result_columnName.join(",")+System.getProperty("line.separator"); 
        
        println "开始生成数据,请耐心等待......"
    },
    {
        rows_count++;
        result_rowsData=[]; //清空对象  
        for (j in 0..result_columnCount-1)
        {            
            if(result_columnType[j]=="VARCHAR2" || result_columnType[j]=="VARCHAR"){ //针对VARCHAR类型进行处理,加上"号
                 String strtemp="";
                //先要判断是否含有中文,有中文就不加"号
           /*     if(isChinaese(it[j]))
                {
                    strtemp=it[j]
                }
                else
                {
                    strtemp="/""+it[j]+"/"";
                }      
                */
                    strtemp="/""+it[j]+"/"";
                 result_rowsData<<strtemp;
            }
            else //其他类型不做处理
            {        
                result_rowsData<<it[j];
            }
        }
 
         file_csv<< result_rowsData.join(",")+System.getProperty("line.separator");
    
    }    
);

println "${file_tableName}数据生成完毕(导出数据行数:${rows_count})/n"

然后再给这个groovy脚本写几个对应的shell/bat执行脚本
比如:
文件名:生成基站.bat
groovy export "select * from shw.chal_cell_base_info"

如图:



那么当每次都要生成最新数据的时候,直接去双击这些bat文件即可.或者你直接把这些bat配置到操作系统的执行任务当中去即可.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息