#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"/>
<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, как показано. Любая помощь будет оценена
Ответ №1:
Поскольку вы запросили Talend — это легко, если вы заранее знаете имена столбцов, потому что тогда вам нужен только tFileInputDelimited -> tFileOutputXML . Если вы не знаете имена столбцов (они находятся в первой строке вашего файла данных), то вам нужно использовать Talend Integration Suite (не Talend Open Studio), который поддерживает «динамические столбцы».
Определите схему вашего файла как один столбец типа Dynamic . Затем этот столбец будет содержать все ваши данные. Но для записи его в формате XML вам потребуется выполнить некоторое кодирование на Java вручную (в компоненте tJavaFlex). Это не сложно, и я, вероятно, мог бы показать вам, как это сделать, если вам нужна дополнительная помощь.
Но, как я уже сказал, это не работает в версии Talend Open Studio, только в версии подписки.
Ответ №2:
попробуйте это
/**
* 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 .= "tt<{$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 /
Комментарии:
1. спасибо за ответ. Речь идет не о преобразовании
csv
вxml
, мне особенно нужно, как преобразовать его с помощью talend .2. Извините, должно быть, пропустил это.
Ответ №3:
Вот программа XQuery, которая должна это сделать:
<entities>
{
let $rows :=
let $input := "ID,Name,Age
1,qwerty,12
2,asdf,11
3,zxcvb,10"
return tokenize($input, "amp;#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>