我有一个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,如图所示。任何帮助将不胜感激
答案 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, " ")
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>