2011-10-10 62 views
0

我有一個CSV爲:了Talend:設置屬性的名稱和相應的列值

ID,Name,Age 
1,qwerty,12 
2,asdf,11 
3,zxcvb,10 

我需要如下創建XML:

<?xml version="1.0" encoding="UTF-8"?> 

<entities> 
    <entity> 
     <field name="ID" value="1"/> 
     <field name="Name" value="qwerty"/> 
     <field name="Age" value="12"/> 
    </entity> 
     <entity> 
     <field name="ID" value="2"/> 
     <field name="Name" value="asdf"/> 
     <field name="Age" value="11"/> 
    </entity> 
     <entity> 
     <field name="ID" value="3"/> 
     <field name="Name" value="zxcvb"/> 
     <field name="Age" value="10"/> 
    </entity> 
</entities> 

列名從一個CSV變化文件到另一個。所以我想要製作一個通用的作業,它會接收所有的列並生成一個xml,如圖所示。任何幫助,將不勝感激

回答

0

試試這個

/** 
    * Converts a CSV file to a simple XML file 
* 
* @param string $file 
* @param string $container 
* @param string $rows 
* @return string 
*/ 
    function csv2xml($file, $container = 'data', $rows = 'row') 
{ 
     $r = "<{$container}>\n"; 
     $row = 0; 
     $cols = 0; 
     $titles = array(); 

     $handle = @fopen($file, 'r'); 
     if (!$handle) return $handle; 

     while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) 
     { 
      if ($row > 0) $r .= "\t<{$rows}>\n"; 
      if (!$cols) $cols = count($data); 
      for ($i = 0; $i < $cols; $i++) 
      { 
        if ($row == 0) 
        { 
         $titles[$i] = $data[$i]; 
         continue; 
        } 

        $r .= "\t\t<{$titles[$i]}>"; 
        $r .= $data[$i]; 
        $r .= "</{$titles[$i]}>\n"; 
      } 
      if ($row > 0) $r .= "\t</{$rows}>\n"; 
      $row++; 
     } 
     fclose($handle); 
     $r .= "</{$container}>"; 

     return $r; 
} 

$xml = csv2xml('/home/user/myfile.csv', 'people', 'person'); 

?> 

發現這個在:http://www.hotscripts.com/listing/convert-a-csv-file-to-xml-using-php/

+0

感謝您的回覆。它不是關於將'csv'轉換爲'xml',我特別需要如何使用** talend **來轉換它。 –

+0

對不起,一定跳過了這個。 – redshark1802

0

這裏是一個XQuery程序,應該這樣做:

<entities> 
{ 
    let $rows := 
    let $input := "ID,Name,Age 
     1,qwerty,12 
     2,asdf,11 
     3,zxcvb,10" 
    return tokenize($input, "&#10;") 
    let $columns := tokenize(head($rows), ",") 
    for $row in tail($rows) 
    let $data := tokenize($row, ",") 
    return 
    <entity> 
    { 
     for $column at $p in $columns 
     return 
     <field name="{$column}" value="{$data[$p]}"/> 
    } 
    </entity> 
} 
</entities> 

測試的嘗試。 zorba-xquery.com,它輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<entities> 
    <entity> 
    <field name="ID" value=" 1"/> 
    <field name="Name" value="qwerty"/> 
    <field name="Age" value="12"/> 
    </entity> 
    <entity> 
    <field name="ID" value=" 2"/> 
    <field name="Name" value="asdf"/> 
    <field name="Age" value="11"/> 
    </entity> 
    <entity> 
    <field name="ID" value=" 3"/> 
    <field name="Name" value="zxcvb"/> 
    <field name="Age" value="10"/> 
    </entity> 
</entities> 
1

既然您問過Talend--如果您事先知道列名,很容易,因爲那樣您只需要tFileInputDelimited-> tFileOutputXML。如果您不知道列名(它們位於數據文件的第一行),那麼您需要使用支持「動態列」的Talend Integration Suite(不是Talend Open Studio)。

將文件的模式定義爲Dynamic類型的單個列。該列將包含所有數據。但是爲了將它寫成XML,您需要手動執行一些Java編碼(在tJavaFlex組件中)。這並不困難,如果你需要進一步的幫助,我可能會告訴你如何去做。

但正如我所說,這隻在訂閱版本中不適用於Talend Open Studio版本。

相關問題