Talend:设置与列对应的属性名称和值

时间:2011-10-10 13:47:44

标签: xml csv talend

我有一个csv:

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,如图所示。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

由于您要求Talend - 如果您事先知道列名称很容易,因为那时您只需要tFileInputDelimited - &gt; tFileOutputXML。如果您不知道列名称(它们位于数据文件的第一行),那么您需要使用支持“动态列”的Talend Integration Suite(而不是Talend Open Studio)。

将文件的架构定义为Dynamic类型的单个列。然后该列将包含您的所有数据。但是要将其写成XML,您需要手动进行一些Java编码(在tJavaFlex组件中)。这并不困难,如果你需要进一步的帮助,我可能会告诉你如何做到这一点。

但正如我所说,这不适用于Talend Open Studio版本,仅适用于订阅版本。

答案 1 :(得分: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/

答案 2 :(得分: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>

在try.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>