Pentaho数据集成转换,从csv文件加载字段(Java API)

时间:2015-09-18 15:49:22

标签: java pentaho etl kettle

我正在尝试使用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中的“获取字段”按钮那样自动执行此操作?

1 个答案:

答案 0 :(得分:1)

如果有人好奇,我找到了解决方案。

您必须使用自己的csv阅读器......

但是你可以在类CsvInputDialog(它的GUI类)中获得一些帮助。有getCsvgetInfo等方法,这些方法是私有的,因此您无法直接使用它们,但您可以使用它们编写自己的方法。然后,@ Dirk说使用setInputFields方法。

或者你可以找到一些现成的csv解析器。