2008-11-24 10 views
1

Je suis en train de concevoir un système qui reçoit des données d'un certain nombre de partenaires sous la forme de fichiers CSV. Les fichiers peuvent différer dans le nombre et l'ordre des colonnes. Pour la plupart, je vais vouloir choisir un sous-ensemble des colonnes, peut-être les réorganiser, et les remettre à un analyseur. Je préférerais évidemment être capable de transformer les données entrantes en un format canonique de manière à rendre l'analyseur aussi simple que possible.Transformation de fichier plat en XML en utilisant la technologie XSLT

Idéalement, j'aimerais pouvoir générer une transformation pour chaque format de données entrant en utilisant un outil graphique et stocker la transformation en tant que document dans une base de données ou sur disque. Lors de la réception des données, j'appliquerais la transformation correcte (peu importe comment je détermine la transformation correcte) pour obtenir un document XML dans un format canonique. Si les fichiers entrants contenaient du XML, j'aurais juste créé un document XSLT pour chaque format et je serais sur mon chemin. J'ai utilisé les extensions XSLT de fichier plat de BizTalk (ou quelque chose comme ça) pour quelque chose de similaire dans le passé, mais je ne veux pas les tracas de BizTalk (et je ne peux pas me le permettre non plus) sur ce projet .

Est-ce que quelqu'un sait s'il existe des technologies alternatives et/ou des extensions XSLT qui me permettrait d'atteindre mon objectif de manière élégante?

Je développe mon application en C# sur .NET 3.5 SP1 (préférant ainsi les technologies supportées par .NET).

Répondre

0

Je pense que vous avez besoin quelque chose comme ça (désolé, pas pris en charge par .NET mais le code est très simple)

http://csv2xml.sourceforge.net

-1

Vous pouvez également jeter un oeil à altova's MapForce

+0

Altova MapForce veut générer du code pour passer d'un fichier plat dans un fichier XML. Il ne le fait pas purement avec XSLT. – Stimy

0

IIRC quelqu'un a créé une bibliothèque "LINQ to CSV" qui pourrait être un point de départ pour créer le fichier XML intermédiaire (en mémoire) comme entrée dans la transformation.

J'ai trouvé here.

0

J'ai trouvé 2 solutions potentielles en regardant dans un espace de problème similaire. Progress Software dispose d'un ensemble d'outils et d'API (.Net) qui, associés aux fichiers .conv (Flat to XML Converter) créés dans leur outil Stylus Studio, permettent la transformation de tout format de fichier plat prédéfini en XML lors de l'exécution. Plus d'infos ici: http://www.datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

De plus il existe un format XML appelé XFLAT qui permet la description de fichiers plats dans divers formats, délimités, largeur fixe etc ... Il existe un programme java qui va convertir des fichiers plats , où vous avez provoqué la description de XFLAT en XML afin que vous puissiez continuer avec une transformation XSLT XML vers XML standard. Plus de détails peuvent être trouvés ici: http://www.unidex.com/overview.htm

Je n'ai jamais réellement utilisé aucun de ces outils, mais les ai trouvés en recherchant un problème semblable.

0

Vous pouvez essayer LINQ to CSV. Il y a une offre de Eric White de Microsoft et une autre de Matt Perdeck. D'autres sont là-bas ...

0

Extrayez this article lors de l'implémentation d'un XmlReader qui traite les entrées non-XML. Ce n'est pas une tâche terriblement difficile, et une fois que vous l'avez fait fonctionner, vous n'avez pas besoin d'utiliser une technologie de type XSLT, vous pouvez simplement utiliser XSLT.

0

cela va analyser la sortie de la commande linux ip route list. C'est juste ce que j'avais autour.

Vous devez envelopper la sortie de la virgule dans un élément appelé 'sortie' et la feuille de style va le prendre à partir de là. La vraie clé ici est la commande tokenize dans la spécification xpath 2.0. Je ne sais pas comment tu pourrais faire ça avant ça. De plus, cela ne fait pas un seul élément racine, car ce n'était pas ce dont j'avais besoin. Dans votre cas, au lieu spliting sur l'espace, Id spli sur ''

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:output method="xml" indent="yes" /> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="//output"> 
    <!-- split things up for each new line --> 
    <xsl:variable name="line" select="tokenize(.,'\n')"/> 
    <xsl:for-each select="$line">       
     <!-- split each line into peices based on space --> 
     <xsl:variable name="split" select="tokenize(.,' +')"/> 
     <xsl:if test="count($split) &gt; 1"> 
      <xsl:element name="route">           
       <xsl:for-each select="$split"> 
        <xsl:choose> 
         <xsl:when test="position() = 1"> 
          <xsl:attribute name="address" select="."/> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:variable name="index" select="position()"/> 
          <xsl:variable name="fieldName" select="."/> 
          <xsl:if test="$fieldName and position() mod 2 = 0"> 
           <xsl:attribute name="{$fieldName}" select="$split[$index + 1]"/> 
          </xsl:if> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each> 
      </xsl:element> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template>