2016-03-09 31 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文件代理:)歡呼! –