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

Posted

技术标签:

【中文标题】Pentaho 数据集成转换,从 csv 文件加载字段(Java API)【英文标题】:Pentaho Data Integration transformation, loading fields from csv file (Java API) 【发布时间】:2015-09-18 15:49:22 【问题描述】:

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

【问题讨论】:

我从来没有用 java 写过任何东西,但是根据 pentaho.com 上的文档,CsvInputMeta 类有一个方法 setInputFields。我在这里进行了大胆的猜测,您可能必须在读取 CSV 文件之前告诉您的 CsvInputMeta 类您期望在 CSV 文件中包含哪些字段。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于Pentaho 数据集成转换,从 csv 文件加载字段(Java API)的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho Kettle 从字符串转换为整数/数字错误

lookup_Pentaho 数据集成

如何使用Pentaho勺子将数据从MySQL数据库推送到Facebook网页

在 Pentaho 中将批量 .xlsx 文件转换为 .csv (UTF-8)

从结果集中获取行并在 Pentaho 数据集成中使用获取变量

Pentaho 数据集成 Google BigQuery Loader 异常