import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.RowListener;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.csvinput.CsvInputMeta;
import org.pentaho.di.trans.steps.dummytrans.DummyTransMeta;
import org.pentaho.di.trans.steps.textfileinput.TextFileInputField;
/**
* kettle 创建动态转换
*
* 共包含两个步骤,一个是读取CSV文件,一个是空操作
*
*
*/
public class CsvFileReader {
private static String STEP_READ_A_FILE = "Read a file";
private static String STEP_DUMMY = "Dummy";
private String fileName;
private TextFileInputField[] inputFields;
private List<RowMetaAndData> rows;
public CsvFileReader(String filename,TextFileInputField[] inputFields) {
this.fileName = filename;
this.inputFields = inputFields;
}
public void read() throws KettleException {
KettleEnvironment.init();
//transformation
TransMeta transMeta = new TransMeta();
transMeta.setName("sample04");//定义转换名称
CsvInputMeta inputMeta = new CsvInputMeta();
inputMeta.setDefault();
inputMeta.setFilename(fileName);
inputMeta.setInputFields(inputFields);
StepMeta inputStep = new StepMeta(STEP_READ_A_FILE,inputMeta);
inputStep.setLocation(50, 50);
inputStep.setDraw(true);
transMeta.addStep(inputStep);
DummyTransMeta dummyMeta = new DummyTransMeta();
StepMeta dummyStep = new StepMeta(STEP_DUMMY,dummyMeta);
dummyStep.setLocation(150,50);
dummyStep.setDraw(true);
transMeta.addStep(dummyStep);
TransHopMeta hop = new TransHopMeta(inputStep, dummyStep);
transMeta.addTransHop(hop);
//可以将转换输出成文件
// String xml = XMLHandler.getXMLHeader()+transMeta.getXML();
// DataOutputStream dos = new DataOutputStream(KettleVFS.getOutputStream("F:\\\\csv.ktr", false));
// try {
// dos.write(xml.getBytes(Const.XML_ENCODING));
// dos.close();
// } catch (UnsupportedEncodingException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//end
Trans trans = new Trans(transMeta);
trans.prepareExecution(null);
rows = new ArrayList<RowMetaAndData>();
RowListener rowLinstener = new RowListener() {
@Override
public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row) throws KettleStepException {
// TODO Auto-generated method stub
rows.add(new RowMetaAndData(rowMeta, row));
}
@Override
public void rowReadEvent(RowMetaInterface arg0, Object[] arg1) throws KettleStepException {
// TODO Auto-generated method stub
}
@Override
public void errorRowWrittenEvent(RowMetaInterface arg0, Object[] arg1) throws KettleStepException {
// TODO Auto-generated method stub
}
};
StepInterface setpInterface = trans.findRunThread(STEP_DUMMY);
setpInterface.addRowListener(rowLinstener);
trans.startThreads();
trans.waitUntilFinished();
if(trans.getErrors() > 0) {
System.out.println(">>>>>>>>>> ERROR");
}else {
System.out.println(">>>>>>>>>> Row size "+rows.size());
}
}
public static void main(String[] args) {
String file = "F:\\csv.csv";
TextFileInputField no1 = new TextFileInputField("id", -1, 8);
no1.setTrimType(ValueMetaInterface.TRIM_TYPE_BOTH);
no1.setFormat("#");
no1.setType(ValueMetaInterface.TYPE_INTEGER);
TextFileInputField no2 = new TextFileInputField("name", -1, 50);
no2.setTrimType(ValueMetaInterface.TRIM_TYPE_BOTH);
no2.setFormat("#");
no2.setType(ValueMetaInterface.TYPE_STRING);
TextFileInputField[] inputs = new TextFileInputField[] {no1,no2};
CsvFileReader reader = new CsvFileReader(file, inputs);
try {
reader.read();
} catch (KettleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}