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

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

目前这个groovy脚本只要输入sql语句,便会自动去反射表中的字段和类型.
脚本名称:export.groovy
  1. import groovy.sql.Sql;
  2. try
  3. {
  4. if(this.args.size()<1)
  5. {
  6.     println "格式错误!请参照下面的正确格式"
  7.     println "export [sql:可以正确执行的sql语句]"
  8.     return;
  9. }
  10. }
  11. catch (Exception e)
  12. {
  13.     println "格式错误!请参照下面的正确格式"
  14.     println "export [sql:可以正确执行的sql语句]"
  15.     return;
  16. }
  17. /*
  18. 连接对象
  19. 可以根据你自己的需要调整
  20. */
  21. sql = Sql.newInstance("jdbc:oracle:thin:@10.220.51.40:1521:ORA10G","用户名","密码","oracle.jdbc.driver.OracleDriver");
  22. /* SQL语句 可以根据自己需要调整*/
  23. strSql=this.args[0];
  24. //方法_获取表名
  25. def getTableName={strSql->
  26.  pattern= ~"FROM .*"
  27.  matcher = strSql.toUpperCase()  =~ pattern
  28.  tableName="";
  29.  while(matcher.find()){
  30.      tableName= matcher.group()
  31.  }
  32.  return tableName.split(' ')[1];
  33. }
  34. //方法判断字符串里面是否有中文
  35. def isChinaese={ str->  
  36.  if(str==null)
  37.      return;
  38.     
  39.  for (i in 0..str.size()-1)
  40.  {
  41.     if(str.charAt(i)>127)
  42.     {
  43.         return true;
  44.     }
  45.  } 
  46.   return false;
  47. }
  48. def file_tableName=getTableName(strSql);//表名
  49. def result_columnCount=0;//列数
  50. def result_columnName=[];//列名
  51. def result_columnType=[];//列类型
  52. def result_rowsData=[];//行数据
  53. def rows_count=0;
  54. //在该脚本的同级目录下生成已表名命名的csv文件
  55. file_csv= new File("${file_tableName}.txt");
  56. //判断文件是否存在,如果存在写删除
  57. if(file_csv.exists()){
  58. println "在当前目录下发现已经存在${file_tableName},程序已经删除文件"
  59.     file_csv.delete()
  60. }
  61. println "准备生成${file_tableName}.csv"
  62. sql.eachRow(strSql,
  63.     {
  64.         result_columnCount= it.getColumnCount();        
  65.         
  66.         println "*********${file_tableName}表结构**********"
  67.         println ":本次导出共生成${result_columnCount}个字段";
  68.         for (i in 1..result_columnCount){  //不同与java,groovy下标从1开始          
  69.             println    it.getColumnName(i) +"   |    "+ it.getColumnTypeName(i) ;   
  70.             result_columnName<<it.getColumnName(i);
  71.             result_columnType<<it.getColumnTypeName(i);           
  72.         }
  73.         println "*********${file_tableName}表结构**********"
  74.         file_csv<<result_columnName.join(",")+System.getProperty("line.separator"); 
  75.         
  76.         println "开始生成数据,请耐心等待......"
  77.     },
  78.     {
  79.         rows_count++;
  80.         result_rowsData=[]; //清空对象  
  81.         for (j in 0..result_columnCount-1)
  82.         {            
  83.             if(result_columnType[j]=="VARCHAR2" || result_columnType[j]=="VARCHAR"){ //针对VARCHAR类型进行处理,加上"号
  84.                  String strtemp="";
  85.                 //先要判断是否含有中文,有中文就不加"号
  86.            /*     if(isChinaese(it[j]))
  87.                 {
  88.                     strtemp=it[j]
  89.                 }
  90.                 else
  91.                 {
  92.                     strtemp="/""+it[j]+"/"";
  93.                 }      
  94.                 */
  95.                     strtemp="/""+it[j]+"/"";
  96.                  result_rowsData<<strtemp;
  97.             }
  98.             else //其他类型不做处理
  99.             {        
  100.                 result_rowsData<<it[j];
  101.             }
  102.         }
  103.  
  104.          file_csv<< result_rowsData.join(",")+System.getProperty("line.separator");
  105.     
  106.     }    
  107. );
  108. println "${file_tableName}数据生成完毕(导出数据行数:${rows_count})/n"


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

如图:

那么当每次都要生成最新数据的时候,直接去双击这些bat文件即可.或者你直接把这些bat配置到操作系统的执行任务当中去即可.

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...