1
我想創建使用Kettle Java API的簡單轉換。Pentaho數據集成轉換,從csv文件(Java API)加載字段
只需兩個塊,一個從csv文件讀取,另一個將其寫入文本文件。
代碼:
PluginRegistry.addPluginType(SpoonPluginType.getInstance());
PluginRegistry.addPluginType(StepPluginType.getInstance());
PluginRegistry.init();
TransMeta transMeta = new TransMeta();
transMeta.setName("testTrans");
String csvStep = "read from file ";
CsvInputMeta csvInputMeta = new CsvInputMeta();
csvInputMeta.setDefault();
csvInputMeta.setFilename(INPUT_FILE);
csvInputMeta.setDelimiter(";");
String csvId = PluginRegistry.getInstance().getPluginId(csvInputMeta);
StepMeta stepMeta = new StepMeta(csvId, csvStep, csvInputMeta);
transMeta.addStep(stepMeta);
TextFileOutputMeta textFileOutputMeta = new TextFileOutputMeta();
textFileOutputMeta.setDefault();
textFileOutputMeta.setFilename(OUTPUT_FILE);
textFileOutputMeta.setFileFormat("txt");
String outPutStep = "Output step";
String outputId = PluginRegistry.getInstance().getPluginId(textFileOutputMeta);
StepMeta stepMeta2 = new StepMeta(outputId, outPutStep, textFileOutputMeta);
transMeta.addStep(stepMeta2);
transMeta.addTransHop(new TransHopMeta(stepMeta, stepMeta2));
transMeta.setName("testTrans");
String xml = transMeta.getXML();
DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File(trans.xml)));
dos.write(xml.getBytes("UTF-8"));
dos.close();
Trans trans = new Trans(transMeta);
trans.execute(null);
trans.waitUntilFinished();
當運行上述代碼的輸出爲:
INFO 18-09 17:32:08,700 - read from file - Line number : 50000
INFO 18-09 17:32:08,703 - Output step - linenr 50000
INFO 18-09 17:32:09,147 - read from file - Line number : 100000
INFO 18-09 17:32:09,149 - Output step - linenr 100000
INFO 18-09 17:32:09,491 - read from file - Line number : 150000
INFO 18-09 17:32:09,492 - Output step - linenr 150000
INFO 18-09 17:32:09,786 - read from file - Line number : 200000
INFO 18-09 17:32:09,788 - Output step - linenr 200000
等。 但我的csv文件實際上包含4行這就是看起來像:
id;val
1;10
2;15
3;20
的問題是轉型「不知道」的字段。 當我將轉換導出到xml文件中時,將其加載到Pentaho Spoon中並按下「Get fields」按鈕,所有工作都正常(僅讀取了3行)。
我知道我可以手動創建這些字段並將它們設置爲csvInputMeta
,但有沒有一種方法可以自動執行此操作,就像在Spoon中按鈕「獲取字段」一樣?
我從來沒有在java中寫過任何東西,但根據pentaho.com上的文檔,CsvInputMeta類有一個方法setInputFields。我在這裏大肆猜測,您可能必須在閱讀CSV文件之前告訴您的CsvInputMeta類您期望的字段。 –