我正在尝试使用Kettle 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并按下“获取字段”按钮,一切正常(只读了3行)。
我知道我可以手动创建这些字段并将它们设置为csvInputMeta
但是有没有办法像Spoon中的“获取字段”按钮那样自动执行此操作?
答案 0 :(得分:1)
如果有人好奇,我找到了解决方案。
您必须使用自己的csv阅读器......
但是你可以在类CsvInputDialog
(它的GUI类)中获得一些帮助。有getCsv
和getInfo
等方法,这些方法是私有的,因此您无法直接使用它们,但您可以使用它们编写自己的方法。然后,@ Dirk说使用setInputFields
方法。
或者你可以找到一些现成的csv解析器。