2016-03-09 35 views
1

Smooks转换的快速问题,想知道是否有人有过同样的事情经验,如果有时间闪耀!的如何阻止出现在smooks的csv输出中的根元素

其实很简单我有一个(非常大).csv文件,我想将它转换为另一种.csv格式(列切换等)..

的Smooks配置文件低于....(位的背景下,它会通过WSO2如果让任何区别 - 该位是工作的罚款)

<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:csv="http://www.milyn.org/xsd/smooks/csv-1.2.xsd" xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd"> 
    <params> 
     <param name="stream.filter.type">SAX</param> 
    </params> 
    <csv:reader fields="ParentSKU,AttributeSKU,WarehouseID,Published,Stock,SellingPrice,InventoryValue" rootElementName="records" recordElementName="row"/> 

    <resource-config selector="row"> 
     <resource>org.milyn.delivery.DomModelCreator</resource> 
    </resource-config> 

    <ftl:freemarker applyOnElement="row"> 
     <ftl:template><![CDATA[${row.ParentSKU},${row.AttributeSKU},${row.WarehouseID},${row.Published},${row.Stock},${row.SellingPrice},${row.InventoryValue}]]></ftl:template> 
     <param name="quote">"</param> 
     <param name="includeFieldNames">true</param> 
     <param name="csvFields">ParentSKU,AttributeSKU,WarehouseID,Published,Stock,SellingPrice,InventoryValue</param> 
     <param name="seperator">,</param> 
     <param name="messageType">CSV</param> 
    </ftl:freemarker> 
</smooks-resource-list> 

输入文件看起来像:

Parent SKU,Attribute SKU,Warehouse ID,Published,Stock,Selling Price,Inventory Value 
23551288,,fc,0,0,119.99,0 
78234225,,fc,0,0,39.99,0 
85275286,,fc,0,0,9.99,0 
71235376,7.14034E+12,fc,1,4,24,96 
45340656,,fc,0,0,6,0 
12343674,,fc,0,0,79.99,0 
78049868,,fc,0,0,39.99,0 
12082748,,fc,0,0,69.99,0 
18302384,,fc,0,0,19.99,0 
31366094,,fc,0,0,19.99,0 

的问题是,在输出我在输出中得到了记录标签,我怎么能阻止它 - 我在过去的24小时里一直在尝试不同的东西。

<records>Parent SKU,Attribute SKU,Warehouse ID,Published,Stock,Selling Price,Inventory Value 
23551288,,fc,0,0,119.99,0 
78234225,,fc,0,0,39.99,0 
85275286,,fc,0,0,9.99,0 
71235376,7.14034E+12,fc,1,4,24,96 
45340656,,fc,0,0,6,0 
12343674,,fc,0,0,79.99,0 
78049868,,fc,0,0,39.99,0 
12082748,,fc,0,0,69.99,0 
18302384,,fc,0,0,19.99,0 
31366094,,fc,0,0,19.99,0 
</records> 

理想我宁愿使用的Smooks配置只有这样我可以把这个给开发谁不是Java知道。

我也到位了资源配置节点的使用

<csv:reader fields="ParentSKU,AttributeSKU,WarehouseID,Published,Stock,SellingPrice,InventoryValue" recordElementName="record" rootElementName="row" skipLines="1"> 
    <csv:singleBinding beanId="row" class="java.util.HashMap"/> 
    </csv:reader> 

尝试,但它做同样的事情。

在此先感谢。

+0

一直在寻找这个......并尝试使用两个ftl:free标记标记与<?TEMPLATE-SPLIT-PI?>但这不匹配节点,如果我把它放在两个只匹配记录,并且不会处理行。我想知道这是否与WSO2服务总线中的xml处理库有关...现在非常困惑。 –

+0

也试过而且这只是一个空文件:( –

回答

-1

您是否尝试过使用DataServices读取数据,然后转换为CSV?

+0

嗨MiniMini,谢谢我看了最后晚上以为你已经有一段时间了:)不幸的是,我想虽然我可以使用DataServices将CSV文件作为服务公开,然后从中读取,但我想要做的是转换,因为我读取它并输出到另一个CSV。我想我可以对该数据源进行查询,然后转换结果,但这会产生很多开销,并且由于文件非常大,我试图尽可能避免这种情况。 –

+0

我可以使用esb和两个代理服务来做类似的事情,一个使用Smook将csv转换为XML文件,然后使用第二个服务来获取该xml,并使用样式表或其他格式将其转换为第二个CSV格式。 –

0

好看起来像有什么在那里解决这个......随意回答,如果你知道不同的,但是我设法得到的地方...

步骤1.在WSO2 ESB禁用的Smooks输出 < inSequence中> <属性名= “DISABLE_SMOOKS_RESULT_PAYLOAD” 值= “真”
范围= “默认” 类型= “STRING”/> <烟配... (除去在标签空格) 这阻止了Smooks浪费t IME和存储器通过默认的Smooks流输出任何东西

步骤2.在Smooks的配置文件写入到一个输出文件不是默认输出流

<ftl:freemarker applyOnElement="row"> 
    <ftl:template>< ![CDATA[${row.ParentSKU},${row.AttributeSKU},${row.WarehouseID},${row.Published},${row.Stock},${row.SellingPrice},${row.InventoryValue} 
    ]]></ftl:template> 
    <ftl:use> 
     <ftl:outputTo outputStreamResource="outputStream" /> 
    </ftl:use> 
</ftl:freemarker> 

<file:outputStream resourceName="outputStream" 
    openOnElement="records"> 
    <file:fileNamePattern>file_output.csv</file:fileNamePattern> 
    <file:destinationDirectoryPattern>/vfs/test</file:destinationDirectoryPattern> 
</file:outputStream> 

(在的开始再次删除空格标签) 这会导致文件在找到标签'records'时打开,然后将所有csv输出路由到该流。

好吧,虽然这个工作真的不是答案,因为它阻止我使用任何ESB功能,特别是它阻止我把文件放在任何有用的地方,例如,使用带有方便文件名的vfs。事实上,因为它是愚蠢的1.1而不是1.4我们甚至不能使用内置的bean来命名带有时间戳或随机数的文件。

但是我可以添加另一个代理来移动文件,一旦它生成或创建我自己的java bean的日期和或随机数字直接从smooks生成一个唯一的文件名。

如果有人提出更好的答案,请让我知道,因为它仍然会帮助!

+0

只有在使用大文件的情况下,如果让输出步骤连接并具有 ESB以及 - 这很奇怪... –

+0

最后...通过fileconnector重命名输出文件(从wso2下载并安装它!),然后添加 file:///vfs/test/ file_output.csv {fn:concat(fn:substring-after(get-property('MessageID'),'urn:uuid:'),'.txt') } 然后通过添加ifs设置来使代理顺序工作... 1 广告我们有一个完整的工作大型CVS文件代理:)欢呼! –