ETL KETTLE 读取csv文件写入数据库

任务:

将大量CSV文件写入数据库中;可以一张表一个csv文件输入,表输出;但是如果表文件太多,达到100多张表入库;那会写死人的;所以我们可以偷懒一下;采用配合kettle java脚本代码;完成任务;

 

场景:将下面文件写入数据中:文件名和表名对应关系如下:

文件名 表名

ccs_A_20190101.csv ccs_A

ccs_B_20190101.csv ccs_B

.......

 

文件格式:

字段1|+|字段2|+|字段3|+|字段4|+|.......|+|字段n

value1|+|Value2|+|value3|+||+|.........|+|valuen

 

实现:

1 新建一个kettle项目文件 ktr

涉及按钮:获取文件名,CSV文件输入,Java代码,SQL脚本

 

组合截图:

ETL KETTLE 读取csv文件写入数据库_第1张图片

获取文件名:

ETL KETTLE 读取csv文件写入数据库_第2张图片

 

 

 

 

CSV文件输入控件

ETL KETTLE 读取csv文件写入数据库_第3张图片

 

java代码:后面单独放java代码块:

 

ETL KETTLE 读取csv文件写入数据库_第4张图片

ETL KETTLE 读取csv文件写入数据库_第5张图片

注意重写这两个函数:

/*设置参数变量*/

public void setVariable(String variableName, String variableValue) {

parent.setVariableImpl(variableName, variableValue);

}

/*获取参数变量*/

public String getVariable(String variableName) {

return parent.getVariableImpl(variableName);

}

 

 

执行SQL脚本:

ETL KETTLE 读取csv文件写入数据库_第6张图片

涉及JAVA代码:

 

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
 

/*设置参数变量*/
public void setVariable(String variableName, String variableValue) {
  parent.setVariableImpl(variableName, variableValue);
}
/*获取参数变量*/
public String getVariable(String variableName) {
  return parent.getVariableImpl(variableName);
}


/**修改参数变量:字段内容,表名*/ 
public String getTableFields(String field,String tablename){
	
	if( "".equals(field) || field==null || "".equals(tablename)|| tablename==null ){
		 return null;
	}  
	String[] valueArr = field.split("\\|\\+\\|",-1);//采用 -1模式,不去除末尾的空格
	  StringBuilder sb = new StringBuilder();
	  for(int i = 0; i< valueArr.length ;i++){
			String value = valueArr[i]; 
				sb.append("`").append(value).append("`,");  
	  }
	  sb.deleteCharAt(sb.length() -1);
	  sb.append(",data_date,dw_created_time,dw_created_by,dw_updated_time,dw_updated_by");
	
	return  sb.toString(); // 
}

/*设置表名或参数*/
public void setSelfVariables(String field,String tablename){
	if( "".equals(field) || field==null || "".equals(tablename)|| tablename==null ){
		 return;
	}

	/**初始化参数*/
	if(getVariable("TABLE_NAME") == null || "".equals(getVariable("TABLE_NAME"))){
		setVariable("TABLE_NAME","");
		setVariable("TABLE_FIELDS","");
		setVariable("ROW_NUMBER",""); 
	};

	String tableName=getVariable("TABLE_NAME") ;//获取表名
	
	/**表名不相同,就设置第一行,以及表名*/
	if(!tableName.equals(tablename)){
		setVariable("TABLE_NAME",tablename);
		setVariable("TABLE_FIELDS",getTableFields(field,tablename));
		setVariable("ROW_NUMBER","0"); 
	} 
	else{
		int row1=Integer.parseInt(getVariable("ROW_NUMBER")) ; 
		row1++;
		setVariable("ROW_NUMBER",""+row1);
	}
}
 
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
	  if (first) {
	    first = false;
	  }

	  Object[] r = getRow();

	  if (r == null) {
	    setOutputDone();
	    return false;
	  }

	  r = createOutputRow(r, data.outputRowMeta.size());
	

	  // Get the value from an input field
	   String filename = get(Fields.In, "filename").getString(r);  
	   if(filename.contains("/"))
			filename=filename.substring(filename.lastIndexOf("/")+1,filename.indexOf("2") -1); //排除Linux环境下的:/tmp/ 反斜杠目录 
		if(filename.contains("\\"))
			filename = filename.substring(filename.lastIndexOf("\\")+1,filename.indexOf("2") -1);//排除windows环境下的D:\ 斜杠目录
		String tablename = filename;
		tablename=tablename+"_detail";
	 
	  
	  String field = get(Fields.In,"field").getString(r);
	 	  
	 /**如果表名相同,就退出 自定义函数*/	 
	  setSelfVariables(field,tablename);  //自定义函数
 
	  String dataDate=getVariable("DATA_DATE","2019-02-23");// 外界传入参数:data_date 第二个参数为默认值://String getVariable = getVariable(variableName, defaultValue);
	  
	  String[] valueArr = field.split("\\|\\+\\|",-1);//采用 -1模式,不去除末尾的空格
	  StringBuilder sb = new StringBuilder();
	  for(int i = 0; i< valueArr.length ;i++){
			String value = valueArr[i];
			if(value == null || value.trim().length() == 0){
				sb.append("null,");
			}else{
				sb.append("'");
				sb.append(value.replace("'", "\\'"));
				sb.append("',");
			} 
	  }
	  sb.deleteCharAt(sb.length() -1);
	  sb.append(",'"+dataDate+"'"); 
	  sb.append(",now(),'同步任务',null,null");
	  String resultStr = sb.toString();
	  
	  //logDebug("tableName="+getVariable("TABLE_NAME")+"  rowNumber="+ getVariable("ROW_NUMBER")+"  resultStr = " + resultStr); //开发打印日志
	  //logDebug("tableFieldsStr="+getVariable("TABLE_FIELDS"));
 
	  get(Fields.Out, "tableName").setValue(r, getVariable("TABLE_NAME"));
	  get(Fields.Out, "tableFieldsStr").setValue(r,  getVariable("TABLE_FIELDS"));
	  get(Fields.Out, "resultStr").setValue(r, resultStr);
	  get(Fields.Out, "rowNumber").setValue(r,  getVariable("ROW_NUMBER"));
	  
	  putRow(data.outputRowMeta, r);

	  return true;
	}

 

 

 

 

你可能感兴趣的:(KETTLE,知识储备,数据库学习笔记,ETL文件写入数据库,KETTLE读写文件,读取csv文件写入数据库,ETL读CSV文件)