首页 > 解决方案 > 如何在使用 dataweave 2.0 将数据附加到 csv 时删除标题

问题描述

我有一个要求,我从数据库中读取数据并将其写入文件,但文件应该只有一个标题。我在这里使用批处理,因为我需要读取大量数据并将数据附加到同一个文件中。但是,对于每个添加的事务标头,如何在多次写入记录时只写入一次标头?

我知道我们可以使用 for-each 来实现这一点,但我想知道这是否可以使用批处理来实现。

电流输出:

col1  col2  col3  col4
abc  333  5ad  gag
col1  col2  col3  col4
ddd  455  d44  ggg

预期输出:

col1  col2  col3  col4
abc  333  5ad  gag
ddd  455  d44  ggg

提前致谢

标签: dataweavemule4

解决方案


您面临的问题是因为您总是使用标题编写 CSV。您需要header=false在 CSV Writer 选项中进行设置。除此之外,我还建议在编写之前聚合行,因此它会更高效,您甚至可以尝试设置deferred=true以缩短时间。这是一个示例代码,您可以了解如何进行。唯一“丑陋”的部分是在开头写标题。

    <flow name="AppendFileInBatch">
        <ee:transform doc:name="Create headers">
            <ee:message >
            </ee:message>
            <ee:variables >
                <ee:set-variable variableName="headers" ><![CDATA[%dw 2.0
output application/java
var cols = ["col1","col2","col3"]
---
(cols joinBy ",") ++ "\n"
                ]]></ee:set-variable>
            </ee:variables>
        </ee:transform>
        <file:write doc:name="Create file with headers" path="out.csv">
            <file:content ><![CDATA[#[vars.headers]]]></file:content>
        </file:write>
        <batch:job jobName="fileAppenderJob">
            <batch:process-records >
                <batch:step name="Batch_Step" >
                    <batch:aggregator doc:name="Batch Aggregator" size="1000">
                        <ee:transform doc:name="Create CSV part">
                            <ee:message >
                                <ee:set-payload ><![CDATA[%dw 2.0
output application/csv header=false
---
payload]]></ee:set-payload>
                            </ee:message>
                        </ee:transform>
                        <file:write doc:name="Append CSV" path="out.csv" mode="APPEND"/>
                    </batch:aggregator>
                </batch:step>
            </batch:process-records>
        </batch:job>
    </flow>

CSV 格式参考:https ://docs.mulesoft.com/dataweave/2.3/dataweave-formats-csv#writer_properties


推荐阅读