我有 10 个文件,它们的列数不同,但所有文件的目标都是相同的。 因为我们知道复制活动总是在源和目标中寻找相同数量的列,所以我的计划是在复制活动中动态添加列并将 null 传递给目标,如果不添加,我们是否有任何方法可以动态创建comumn来自源文件。
我尝试了多种方法,但每次遇到意外类型“|List`1”时都不起作用错误
复制活动无法根据目标数据动态添加列。相反,您可以使用数据流来实现此目的。
为此,创建 3 个数据集。
一个是源文件列表。在此仅给出直到源文件夹的路径。
第二个也用于源,但在这里,创建一个数据集参数
filename
并将其用作数据集的文件名 @dataset().filename
。
最后一个数据集用于目标文件。给出该数据集中的目标文件路径。
这些是我的示例源文件:
样本1.csv
col4,col3,col2,col5,col1
mycol4,1,22,mycol5,B
mycol4,2,23,mycol5,B
样本2.csv
col8,col3,col2,col9,col4
mycol8,1,22,mycol9,mycol4
mycol8,2,23,mycol9,mycol4
样本3.csv
col1,col3,col2,col6,col7,col8
Rakesh,1,22,2000-16-02,B,C
Laddu,2,23,2001-16-03,B,C
MS,3,42,1981-07-07,B,C
在目标 csv 文件中,我只获取了标题。您的目标文件可能包含数据。
col1,col2,col3,col4,col5,col6,col7,col8,col9
在数据流中,将目标数据集作为一个源,将带参数的源数据集作为另一个源。
在目标数据集源中,导入投影并确保所有数据类型与源数据匹配。这里,我将所有数据类型设置为字符串。
在源中,不要导入任何投影并清除数据集中的模式。
在 TargetAsSource 之后进行联合转换,并通过 Name 将其与 Source 联合。
接下来添加水槽。接收器数据集应该是目标数据集。转到接收器设置 -> 将文件名称选项设置为输出到单个文件,并在输出到单个文件选项中给出实际的文件名。
现在,创建一个管道并使用之前创建的第一个源数据集执行“获取元数据”活动。在“获取元数据”活动的字段中,输入 ChildItems。这将给出源文件夹中的所有文件名列表。
在此之后进行 For-Each 活动,并将子项数组
@activity('Get Metadata1').output.childItems
从此传递给 for-each 表达式。确保选中 For-Each 活动中的 Sequential 复选框。
在 For-Each 内,获取数据流活动并将上述数据流提供给它。将
@item().name
指定给源数据集参数,如下所示。
现在,调试管道,所有源文件数据将被合并,并在管道运行后添加具有空值的所需列。