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

Pentaho Data Integration transformation, loading fields from csv file (Java API)

我正在尝试使用 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

问题是转换"doesn't know"字段是什么。 当我将转换导出到 xml 文件,将其加载到 Pentaho Spoon 并按下 "Get fields" 按钮时,一切正常(只读取了 3 行)。

我知道我可以手动创建这些字段并将它们设置到 csvInputMeta 但有没有办法像 Spoon 中的按钮 "Get fields" 一样自动执行此操作?

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

您必须使用自己的 csv reader...

但是您可以在 class CsvInputDialog(其 GUI class)中获得一些帮助。有像getCsvgetInfo这样的方法,它们是私有的所以你不能直接使用它们但是你可以用它们来写你自己的方法。然后正如@Dirk所说,使用setInputFields方法。

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