Talend: настройка имени и значения атрибута, соответствующего столбцам - PullRequest
0 голосов
/ 10 октября 2011

У меня есть 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 ]

1 голос
/ 10 октября 2011

Поскольку вы запросили Talend - легко, если вы заранее знаете имена столбцов, потому что тогда вам нужен только tFileInputDelimited -> tFileOutputXML.Если вы не знаете имен столбцов (они находятся в первой строке файла данных), вам нужно использовать Talend Integration Suite (не Talend Open Studio), который поддерживает «динамические столбцы».

Определите схему вашего файла как один столбец типа Dynamic.Этот столбец будет содержать все ваши данные.Но для того, чтобы записать его в формате XML, вам нужно будет выполнить некоторое Java-кодирование вручную (в компоненте tJavaFlex).Это не сложно, и я мог бы показать вам, как это сделать, если вам нужна дополнительная помощь.

Но, как я уже сказал, это не работает в версии Talend Open Studio, только в версии с подпиской.

0 голосов
/ 10 октября 2011

Вот программа 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>
0 голосов
/ 10 октября 2011

попробуйте

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...