【发布时间】:2014-09-10 07:42:50
【问题描述】:
我想合并两个 CSV 文件。我面临的问题是两个 CSV 文件之一具有动态列。
例如
第一个 CSV 文件有两列。 A 和 G。G 列有逗号分隔值。
A | G |<-Column Names
--|---------|
A1| G1,G2,G3| <-Row
A2| G2,G5,G6|<-Row
第二个 CSV 文件具有动态列。但它总是有 A(uid) 列。例如
A | C1 |C2 |Othercolumns|<-Column Names
--|-------|---------|------------|
A1|C1Value|C2Value | |<-Row
A2|C1Value| C2Value | |<-Row
我想合并这两个文件所以输出将是:
A |G | C1 |C2 |Othercolumns|<-Column Names
--|-----------|-------|---------|------------|
A1| G1,G2,G3 |C1Value|C2Value | |<-Row
A2| G2,G5,G6 |C1Value| C2Value | |<-Row
这是工作。
我没有检查 tfileoutputdelimited_1 中的包含头选项。 这会正确合并 csv 文件,但不会带来第二个 CSV 文件的列信息(一个带有动态列的文件)。输出如下图所示。
A |G | | | |
--|-----------|-------|---------|------------|
A1| G1,G2,G3 |C1Value|C2Value | |<-Row
A2| G2,G5,G6 |C1Value| C2Value | |<-Row
要获取列名,当我检查输出文件中的“包含标题”选项时,会出现以下异常。
java.lang.NullPointerException
at routines.system.DynamicUtils.writeHeaderToDelimitedFile(DynamicUtils.java:72)
at content.csvmergetest_0_1.CSVMergeTest.tFileInputDelimited_2Process(CSVMergeTest.java:2696)
at content.csvmergetest_0_1.CSVMergeTest.runJobInTOS(CSVMergeTest.java:3109)
at content.csvmergetest_0_1.CSVMergeTest.main(CSVMergeTest.java:2975)
如下所示,在这种情况下,仅从 Tfileinputdelimited_2 中提取一行。我猜那行是标题列,这就是 nullpointer 异常的原因。
为什么会这样?我将如何获得标题? 请告诉我如何实现这一目标。
【问题讨论】:
-
我认为您遇到了一个错误,因为您无法控制如何将标头写入文件。我不能确定,因为我没有 TIS/付费版的副本,所以我无法复制。您是否已经尝试将表保存在测试数据库中?只是来看看是怎么回事?无论如何,AFAIK 在使用动态模式时,您的模式定义中只能有一列(动态一列)。但正如我所说,我无法测试:(
-
有趣的是,我实际上只是构建了一些我意识到可以使用这个确切功能的东西,但它对我来说效果很好。你能检查一下你的动态列集中的所有列实际上都有一个标题吗?否则我猜头被设置为空,然后将动态数据写入分隔文件的方法需要一个非空头。
-
所有列都有标题。为什么当我将包含标题设置为 true 时 tfileInputDelimited_2 获取单行?
-
您能否在您的问题中编辑一些 2 tFileInputDelimited 组件配置的屏幕截图?