当前位置: 首页 > 知识库问答 >
问题:

用Talend实现的带参数的Java程序

万俟招
2023-03-14

我被要求编写一个Java程序,它将TSV文件作为一个插注,并生成一个不同的TSV文件(其中有相当多的变化,在输入和参数上非常可变)作为输出。

这是一个相当大的程序(花了我3天的时间来编码,但我不擅长),它终于开始处理来自15k行的输入,生成1500K行输出。

写代码时,我不知道我必须在Talend中实现它,所以这是一个普通的Java程序,有4个参数:输入文件名,输出文件名,int,int

我设法把我的主要作为一个例程与所需的额外包(个人和openCSV)。

我的问题是:在Talend中实现它而不改变它是可能的吗?我不能告诉塔伦德,这是输入中的文件,这些是参数吗?我在昨天之前从未听说过塔伦德。

如果你感兴趣,这是主要的,但我相信我的问题是相当普遍的。

public static void main(String[] args) throws ArgsExceptions {

    // Boolean set to true while everything is good
    Boolean everythingOk = true;

    String inputFile = null; // Name of the entry file to be transposed.
    String outputFile = null; // Name of the output file.
    int serieNb = 1 ; // Number of columns before the actual values in the input file. Can be columns describing the product as well as empty columns before the values.
    int linesToCopy = 0; // Number of lines composing the header of the file (those lines will be copy/pasted in the output)

    /*
     * Handling the arguments first. 
     */
    try {
        switch (args.length) {
        case 0:
            throw new EmptyArgsException();
        case 1:
            inputFile = args[0];
            String[] parts = inputFile.split("\\.");
            // If no outPutFile name is given, will add "Transposed" to the inputFile Name
            outputFile = parts[0] + "Transposed." + parts[1]; 
            break;
        case 2:
            inputFile = args[0];
            outputFile = args[1];
            break;
        case 3:
            inputFile = args[0];
            outputFile = args[1];
            serieNb = Integer.parseInt(args[2]);
            break;
        case 4:
            inputFile = args[0];
            outputFile = args[1];
            serieNb = Integer.parseInt(args[2]);
            linesToCopy = Integer.parseInt(args[3]);
            break;
        default:
            inputFile = args[0];
            outputFile = args[1];
            serieNb = Integer.parseInt(args[2]);
            linesToCopy = Integer.parseInt(args[3]);
            throw new OutOfBordersArgsException();

        }
    }
    catch (ArgsExceptions a) {
        a.notOk(everythingOk);
    }
    catch (NumberFormatException n) {
        System.out.println("Arguments 3 & 4 should be numbers."
                + " Number 3 is the Number of columns before the actual values in the input file. \n"
                + "(Can be columns describing the product as well as empty columns before the values. (1 by default)) \n"
                + "Number 4 is the number of lines to copy/pasta. (0 by default) \n"
                + "Please try again.");
        everythingOk = false;
    }
    // Creating an InputFile and an OutputFile
    InputFile ex1 = new InputFile(inputFile, linesToCopy); 
    OutputFile ex2 = new OutputFile(outputFile);

    if (everythingOk) {
        try (   FileReader fr = new FileReader(inputFile);
                CSVReader reader = new CSVReader(fr, '\t', '\'', 0);
                FileWriter fw = new FileWriter(outputFile);
                CSVWriter writer = new CSVWriter(fw, '\t', CSVWriter.NO_QUOTE_CHARACTER)) 
        {

            ex1.setReader(reader);
            ex2.setWriter(writer);
            // Reading the header of the file
            ex1.readHead();
            // Writing the header of the file (copy/pasta)
            ex2.write(ex1.getHeadFile());

            // Handling the line containing the columns names
            HeadOfValuesHandler handler = new HeadOfValuesHandler(ex1.readLine(), serieNb);
            ex2.writeLine(handler.createOutputHOV());

            // Each lien will be read and written (in multiple lines) one after the other.
            String[] row;
            CommonLine cl1; 
            // If the period is monthly
            if (handler.isMonthly()) { 

                while (!ex1.isAllDone()) { 

                    row = ex1.readLine();
                    if (!ex1.isAllDone()) {
                        cl1 = new CommonLine(row, handler.getYears(), handler.getMonths(), serieNb);

                        ex2.write(cl1.exportOutputLines());
                    }   
                }
            }
            // If the period is yearly
            else {

                while (!ex1.isAllDone()) { 

                    row = ex1.readLine();
                    if (!ex1.isAllDone()) {
                        cl1 = new CommonLine(row, handler.getYears(), serieNb);

                        ex2.write(cl1.exportOutputLines());     
                    }       
                }
            }       
        }
        catch (FileNotFoundException f) {
            System.out.println(inputFile + " can't be found. Cancelling...");
        }
        catch (IOException e) {
            System.out.println("Unknown exception raised.");
            e.printStackTrace();
        }

    }

}

感谢您阅读本文!

共有2个答案

巴博耘
2023-03-14

不,不更改代码就无法在Talend中按原样使用代码。

但是,如果定义良好,则可以重新创建工作流。

编辑

正如54l3d所指出的,可以添加外部库并调用它们,如果只能完成少量额外工作,这似乎是一个很好的解决方案。如果环境需要,例如,如果有很多工作要维护,最好使用“本地”Talend。

阎彬炳
2023-03-14

如果需要保持原样,您可以将代码打包为任何可运行格式,然后通过TalendtSystem组件调用它,如果是Jar文件,则通过tLibraryLoadcomponent调用它。

 类似资料:
  • 事情是这样的: 我被要求开发一个JAVA程序,该程序将对。tsv文件进行一些重组(移动单元格以进行某种换位)。 所以,我试着干干净净地做,现在得到了3个不同的包: 稍后将出现的另一个问题是,我不知道如何解析程序所需的参数。 不管怎样,谢谢你阅读这篇文章!

  • 我正在实现一个Java图形库(学习...)。因此,我写了一个界面 作为实现的第一步,我正在编写实现上述接口的Digram类。然而,为了简单起见,我希望节点标识符为整数,因此我将函数定义为 但是,我遇到了错误,我需要用超类型覆盖或实现方法。有人可以向我解释这种行为的基础吗?此外,如果有人可以解释,我们如何设计允许灵活地添加任何类型组件的库。

  • 问题内容: 我是否可以使用一组参数启动 Java WebStart 应用程序,就像用标记配置了applet一样? 谢谢 问题答案: 是的,您可以看到以下示例: 显示向您传递参数“ -user = bob”和“ -pass = 8jkaiuasu”到应用程序。以标准方式获取参数。

  • 奖金f(a_3,(a_3+A_4)*4)可以捕捉所有的表达式,而不仅仅是(a_3,(a_3+A_4)?

  • 我需要制作一个程序,从命令行获取可选参数。如果显示flag,我需要读取下面的正则表达式,并将其作为字符串保存到程序中。类似于: 我现在看到的是: 但是,当我从文件夹运行程序时,其中有些文件是和,程序将打印“file1.java”。如何使用“*.java”获取变量? 当我尝试打印所有参数时,使用: 它给了我: 这让我得出结论,我需要以不同的方式阅读参数...

  • 本文向大家介绍Nginx 根据URL带的参数转发的实现,包括了Nginx 根据URL带的参数转发的实现的使用技巧和注意事项,需要的朋友参考一下 使用场景: 需要根据截取URL动态配置跳转路径,常见于访问内网不固定ip地址的文件图片, 请求地址:http://11.19.1.212:82/bimg4/32.52.62.42:222/DownLoadFile?filename=LOC:12/data/