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"/>
        <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>