2015-09-18 63 views
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中按鈕「獲取字段」一樣?

+0

我從來沒有在java中寫過任何東西,但根據pentaho.com上的文檔,CsvInputMeta類有一個方法setInputFields。我在這裏大肆猜測,您可能必須在閱讀CSV文件之前告訴您的CsvInputMeta類您期望的字段。 –

回答

1

如果有人好奇,我找到了解決辦法。

你必須使用自己的CSV閱讀...

但你可以在課堂上CsvInputDialog(其GUI類)一些幫助。有像getCsvgetInfo這些方法,這些是私人的,所以你不能直接使用它們,但你可以使用它們來編寫自己的方法。然後如@Dirk所說的使用setInputFields方法。

或者您可以找到一些準備好的csv解析器。