我想知道如何从csv中的字段中提取“提取”的数字,然后用递增的数字重写该文件。
我需要在tMap中使用这个计数器。
设计下面是一个好方法吗?
编辑:我正在尝试一种新方法。看下面我的subjob的设计,但是当我在主要工作中将tjavarow链接到我的主tmap时出现错误
Exception in component tMap_1
java.lang.NullPointerException
at mod_file_02.file_02_0_1.FILE_02.tFileList_1Process(FILE_02.java:9157)
at mod_file_02.file_02_0_1.FILE_02.tRowGenerator_5Process(FILE_02.java:8226)
at mod_file_02.file_02_0_1.FILE_02.tFileInputDelimited_2Process(FILE_02.java:7340)
at mod_file_02.file_02_0_1.FILE_02.runJobInTOS(FILE_02.java:12170)
at mod_file_02.file_02_0_1.FILE_02.main(FILE_02.java:11954)
2014-08-07 12:43:35|bm9aSI|bm9aSI|bm9aSI|MOD_FILE_02|FILE_02|Default|6|Java
Exception|tMap_1|java.lang.NullPointerException:null|1
[statistics] disconnected
在此输入图片说明
答案 0 :(得分:1)
您应该能够在tMap或tJavaRow中执行此流程。
只需将数字作为整数(或其他数字数据类型)读取,然后将增量添加到其中。
一个非常简单的例子可能如下所示:
这里我们有一个tFixedFlowInput,它有一些作业的硬编码值:
我们通过tMap运行它,我们在age列中添加1:
最后,我们将它输出到表格中的控制台:
编辑:
由于Gabriele B有pointed out,当读取和写入同一个平面文件时,这并不完全有效,因为Talend在读取时声明对文件进行独占读写锁定并保留它在整个工作中开放。
相反,您必须将增量数据写入其他位置(如临时文件,数据库或甚至只是缓冲区),然后将该数据读入单独的作业,然后输出您想要的文件并清理任何暂时的事情。
问题在于您无法在同一过程中执行输出。我刚尝试在一个子作业中测试文件中的读取,使用tBufferOutput将数据传递回父作业,然后将该数据作为上下文变量传递给另一个子作业,然后尝试输出到该文件。不幸的是,文件锁仍然存在于其中,因此您无法在一个自包含作业中执行此操作(即使使用父作业和多个子作业)。
如果这对你来说听起来很糟糕(确实如此)并且你绝对需要这样做(我建议数据库表听起来比平面文件更能匹配此功能)那么你可以提出一个功能请求在Talend Jira上,tFileInputDelimited不保持文件打开或不坚持对文件进行独占读写锁定。
再一次,我强烈建议您转而使用数据库表,因为即使没有文件锁定问题,这绝对不是正确使用平面文件,这个用例非常适合数据库,甚至是轻量级作为嵌入式H2 database。