2009-11-13 5 views
0

j'ai beaucoup de fichiers avec des données pour convertir en pourcentages en utilisant des fonctions mathématiques de base:entiers négatifs à pourcentage

<param id="1" name="otb" value="0.160"/> 
<param id="2" name="blm" value="-0.210"/> 
<param id="3" name="mep" value="-0.010"/> 
<param id="4" name="plc" value="-0.100"/> 

Chaque id get sa propre équation:

  1. (n - (-. 3))/2,3 * 100
  2. (n - (-. 8))/3,3 * 100
  3. (n - (-. 5))/1,5 * 100
  4. (n -. (1)) /1.1*100

J'obtiens:

OTB = 8 BLM = 20 = 24 mep plc = 0

Quelle serait une bonne façon de gérer tous ces fichiers par ... regex et php ? Tout code rapide et sale là-bas? : D

+0

Je suppose que nous aurions besoin de savoir ce que "ces fichiers" ressemblent à RegExes. – Franz

+0

Devoir, ou vrai défi? –

+0

A dû envelopper dans les étiquettes de code. Fixé. –

Répondre

1

Comme le fichier semble être au format XML, je vous suggère d'essayer la bibliothèque PHP simplexml. La documentation peut être trouvée here.

Vous pouvez alors accéder à l'arborescence XML simplement en accédant aux propriétés magiques de l'objet XML:

$xml = simplexml_load_file('your/path/to/your/file'); 

foreach ($xml->param as $param) 
{ 
    $id = $param['id']; 
    $name = $param['name']; 
    $value = $param['value']; 

    // do your calculations... 
} 
+0

Ou une simple transformation avec une feuille de style XML. :-) –

+0

@Bravo Charly: Cela a-t-il fonctionné? – Franz

+0

@Franz: Ça a l'air bon jusqu'à présent ... toujours en train de lire la documentation. Je ne suis en aucun cas un codeur, ha. –

0

Stylesheet magique:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes" standalone="yes" omit-xml-declaration="yes" method="xml"/> 
    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:variable name="Values" select="@*[(name(..)='param') and ((name(.)='value'))]"/> 
     <xsl:variable name="NonValues" select="@*[. != $Values]"/> 
     <xsl:apply-templates select="$NonValues" mode="NonValues"/> 
     <xsl:apply-templates select="$Values" mode="Values"/> 
     <xsl:choose> 
     <xsl:when test="*"> 
      <xsl:apply-templates select="*"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="."/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*" mode="Values"> 
    <xsl:attribute name="value"><xsl:variable name="n" select="."/><xsl:choose><xsl:when test="../@id=1"><xsl:value-of select="(($n - (-0.3)) div 2.3) * 100"/></xsl:when><xsl:when test="../@id=2"><xsl:value-of select="(($n - (-0.8)) div 3.3) * 100"/></xsl:when><xsl:when test="../@id=3"><xsl:value-of select="(($n - (-0.5)) div 1.5) * 100"/></xsl:when><xsl:when test="../@id=4"><xsl:value-of select="(($n - (0.1)) div 1.1) * 100"/></xsl:when><xsl:otherwise><xsl:value-of select="."/></xsl:otherwise></xsl:choose></xsl:attribute> 
    </xsl:template> 
    <xsl:template match="@*" mode="NonValues"> 
    <xsl:copy> 
     <xsl:value-of select="(.)*2"/>pp 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Si vous pouvez transformer le XML original avec cette feuille de style, vous obtiendrez un nouveau XML avec des résultats calculés. C'est un peu complexe mais fondamentalement le code traite tous les éléments et les éléments enfants. Pour chaque élément, il divise les attributs en valeurs à convertir et en d'autres valeurs. Il copie chaque élément, chaque élément enfant et chaque attribut, à l'exception des attributs de valeur. Les attributs de valeur sont traités et ont une autre valeur. (Mais vous pouvez aussi simplement ajouter la valeur d'origine, si vous voulez la conserver.)

Questions connexes