Xml Talend:设置列对应的属性名称和值
我有一个csv作为:Xml Talend:设置列对应的属性名称和值,xml,csv,talend,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"/>
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,如图所示。任何帮助都将不胜感激试试这个
/**
*将CSV文件转换为简单的XML文件
*
*@param string$文件
*@param string$container
*@param string$行
*@返回字符串
*/
函数csv2xml($file,$container='data',$rows='row')
{
$r=“\n”;
$row=0;
$cols=0;
$titles=array();
$handle=@fopen($file,'r');
如果(!$handle)返回$handle;
while(($data=fgetcsv($handle,1000,,'))!==FALSE)
{
如果($row>0)$r.=“\t\n”;
如果(!$cols)$cols=计数($data);
对于($i=0;$i<$cols;$i++)
{
如果($row==0)
{
$titles[$i]=$data[$i];
继续;
}
$r.=“\t\t”;
$r.=$data[$i];
$r.=“\n”;
}
如果($row>0)$r.=“\t\n”;
$row++;
}
fclose($handle);
$r=”;
返回$r;
}
$xml=csv2xml('/home/user/myfile.csv','people','person');
?>
在以下位置找到此项:这是一个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>
{
让$rows:=
让$input:=“ID、姓名、年龄
1,qwerty,12
2,asdf,11
3,zxcvb,10“
返回标记化($input,
;)
让$columns:=标记化(头($rows),“,”)
对于尾部的$row($rows)
让$data:=标记化($row,“,”)
返回
{
对于$columns,在$columns中的$p处
返回
}
}
在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>
既然您要求使用Talend,那么如果您事先知道列名就很容易了,因为这样您只需要tFileInputDelimited->tFileOutputXML。如果您不知道列名(它们位于数据文件的第一行),则需要使用支持“动态列”的Talend Integration Suite(而不是Talend Open Studio) 将文件的架构定义为Dynamic类型的单个列。该列将包含您的所有数据。但要将其写成XML,您需要手工进行一些Java编码(在tJavaFlex组件中)。这并不难,如果你需要进一步的帮助,我可能会告诉你怎么做
但正如我所说,这在Talend Open Studio版本中不起作用,只在订阅版本中起作用。感谢您的回复。这不是关于将
csv
转换为xml
,我特别需要如何使用talend进行转换。抱歉,我一定跳过了这一步。