IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Utiliser split avec des lettres différentes


Sujet :

JavaScript

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Utiliser split avec des lettres différentes
    Bonjour à tous,

    Actuellement, je recois des données sou ce format

    24,966,60,0,200,0,0,0,24,0,429
    séparées par des virgules, et je les récupèrent ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      return{
        te:astr[0],
        pr:astr[1],
      //  al:astr[2],
        hu:astr[2],
        //mo:astr[5],
        lu:astr[3],
        w1:astr[4],
        w2:astr[5],
        w3:astr[6],
        da:astr[7],
        //aq:astr[11],
        ts:astr[8],
        ga:astr[9],
        ba:astr[10],
        //wi:astr[14],
      };
    }
    Ca fonctionne bien mais ce qui m'ennuie c'est que j'envoie des données de capeurs inactifs. Ceux qui ont une valeur de 0.

    Dans le but d'optimiser ceci, j'aimerais envoyer mes données ainsi

    a24b966c60d0e200f0g0h0i24j0k429
    et pour faire mieux, je supprime les valeurs des capteurs inactifs

    a24b966c60e200i24k429
    Comme vous l'avez surement compris, la lettre sert à identifier la valeur du capteur. Si le capteur 'j 'est activé, il y aura en plus 'j34'

    La première question que j'ai c'est ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String.fromCharCode.apply(null,bytes);
    Est-ce que ceci va me convertir des byte en String?

    L'autre question plus importante, comment je peut utiliser split pour qu'il ne tienne plus en compte des ',' (soit toujours le même caractères, mais des lettres différentes

    L'idée est "de dire" au code:
    "dès que tu rencontre une lettre, prends la valeur qui suit jusqu'à la prochaine lettre. Puis prend la prochaine lettre pour retenir la valeur qui la suit. Ainsi de suite"

    pour ensuite faire un switch pour récupérer la lettre et donner sa valeur à la variable correspondante. Un peu du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    switch(lettre) {
        case a:
            te:[valeru de a]; // temperature
            break;
        case b:
            pr:[valeru de b]; //pression
            break;
        case c:
            hu:[valeru de c]; // humidité air
            break;
        case d:
            lu:[valeru de d]; // Luminosité
            break;
        case e:
            wi:[valeru de e]; // humidité sol 1
            break;
        case f:
            w2:[valeru de f]; // humidité sol 2
            break;
        case g:
            w3:[valeru de g]; // humidité sol 3
            break;
        case h:
            da:[valeru de h]; // date
            break;
        case i:
            ts:[valeru de i]; // temperature sol
            break;
        case j:
            ga:[valeru de j]; // Pluviometre
            break;
        case k:
            ba:[valeru de k]; // Batterie
            break;
        default:
     
    }
    // retourne les valeurs
      return{
        te,
        pr,
        hu,
        lu,
        w1,
        w2,
        w3,
        da,
        ts,
        ga,
        ba,
      };
    Je vous avoue ne pas savoir comment faire! Masi pas du tout
    Donc, avoir le même résultat mais faire une split sur une lettre différente
    et un switch sur la lettre.

    Voyez-vous l'idée?

    Milles mercis pour vos lumières!!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 305
    Points : 15 633
    Points
    15 633
    Par défaut
    vu le format de votre chaine d'entrée, j'essaierai une expression régulière pour le découpage :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	let t = "a24b966cde60e200i24kze429";
     
    	let regex = /([a-z]+)(\d+)/g;
     
     
    	let resultats = [];
    	let paire;
     
     
    	while (null !== (paire = regex.exec(t))) {
    		resultats.push(paire);
    	}
     
    	console.log(resultats);

    ensuite vous pouvez parcourir le tableau "resultats" pour associer les valeurs.

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    On peut aussi présenter les résultats sous la forme de deux Array (capteur, valeur) :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    let
        t = "a24b966cde60e200i24kze429",
        regex = /([a-z]+)(\d+)/g,
        arTmp = t.split(regex),
        boolCapteur = true,
        arCapteurs = [],
        arValeurs = [];
     
    // debug
    console.log(`arTmp = ${ arTmp }`);
     
    // arTmp = ,a,24,,b,966,,cde,60,,e,200,,i,24,,kze,429,
     
    for (const [i, item] of arTmp.entries()) {
        if (i % 3 === 0) {
            continue;
        }
     
        if (boolCapteur) {
            arCapteurs.push(item);
        } else {
            arValeurs.push(item);
        }
     
        boolCapteur = !boolCapteur;
    }
     
    // debug
    console.log(`Capteurs : ${ arCapteurs }`);
    console.log(`Valeurs : ${ arValeurs }`);
     
    /*
    Capteurs : a,b,cde,e,i,kze
    Valeurs : 24,966,60,200,24,429
    */
     
    for (const [i, item] of arCapteurs.entries()) {
        console.log(`Capteur ${ item } = ${ arValeurs[i] }`);
    }
     
    /*
    Capteur a = 24
    Capteur b = 966
    Capteur cde = 60
    Capteur e = 200
    Capteur i = 24
    Capteur kze = 429
    */

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    Si le problème est juste de prendre moins de place mémoire pour des données, alors je pense qu'il serait préférable d'utiliser la compression par Abraham Lempel et Jacob Ziv .

    il y a justement une librairie JS sur Git-Hub qui le permet facilement : https://github.com/pieroxy/lz-string/

    site => http://pieroxy.net/blog/pages/lz-string/index.html

    exemple de code (copie de la page du site) :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var string = "This is my compression test.";
    alert("Size of sample is: " + string.length);
    var compressed = LZString.compress(string);
    alert("Size of compressed sample is: " + compressed.length);
    string = LZString.decompress(compressed);
    alert("Sample is: " + string);

    Ça permet d'éviter de créer des fonctions astucieuses de toutes sortes avec des algorithmes géniaux dans lesquels on a vite fait de se prendre les pieds dans le tapis
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour à tous et merci pour vos réponses.

    J'ai peur de me ridiculiser concernant le language.

    J'ai pas trop compris vos exemples, particulièrement avec let, mais ca ma bien aidé à avancer.

    Grâce à vos exemple, j'ai réussi à faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      var resultats = [];
    	var paire;
     
      var decoded = {}
     
      while (null !== (paire = regex.exec(astr[0]))) {
    		//console.log(paire[1]);
    		switch(paire[1]){
    		  case 'a':
    		    console.log("te",paire[2]);
    		    break;
    		  case 'b':
    		    console.log("pr",paire[2]);
    		    break;
    		  case 'c':
    		    console.log("hu",paire[2]);
    		    break;
    		  case 'd':
    		    console.log("lu",paire[2]);
    		    break;
    		  case 'e':
    		    console.log("w1",paire[2]);
    		    break;
    		  case 'f':
    		    console.log("w2",paire[2]);
    		    break;
    		  case 'g':
    		    console.log("w3",paire[2]);
    		    break;
    		  case 'h':
    		    console.log("da",paire[2]);
    		    break;
    		  case 'i':
    		    console.log("ts",paire[2]);
    		    break;
    		  case 'j':
    		    console.log("ga",paire[2]);
    		    break;
    		  case 'k':
    		    console.log("ba",paire[2]);
    		    break;
     
    		}
    		resultats.push(paire);
    	}
     
      return decoded
     
    }
    et ceci
    61 32 38 62 39 36 34 63 34 36 64 32 35 65 31 30 30 68 30 6B 34 32 39 2C 00
    m'affiche ceci pur ce :

    Decoder:"te" - "28"
    Decoder:"pr" - "964"
    Decoder:"hu" - "46"
    Decoder:"lu" - "25"
    Decoder:"w1" - "100"
    Decoder:"da" - "0"
    Decoder:"ba" - "429"
    {}
    Donc très bien,sauf que je dois maintenant remplir
    decoded ={}

    Si je return resultats = []

    il m'affiche une erreur.

    Dans la boucle while, je dois remplir encoded, pour avoir ce résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    decoded={
    te:28,
    pr:964,
    hu:46,
    lu:25,
    w1:100,
    da:0,
    ba:429,
    }
    Ce format est indispensable.
     
    return encoded;
    Si vous pouviez encore m'aider, la dessus, ca serait super top!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    l'instruction let, c'est comme une instruction var, sauf que sa portée est limité à la fonction dans laquelle elle est présente.
    et le fait de placer une virgule apres l'affectation du let , évite à répéter le let (ou le var).mais il faut bien sur toujours terminer avec un point virgule


    pour remplir ton objet decoded

    faut juste que tu remplace
    console.log("te",paire[2]);par decoded.te = paire[2];ou
    par decoded['te'] = paire[2]; , car c'est équivalent en JavaScript.

    sinon tu peut aussi simplifier ton code en utilisant une table : CodRef = ['te','pr','hu','lu','wi','w2','w3','da','ts','ga','ba'];
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var CodRef = ['te','pr','hu','lu','wi','w2','w3','da','ts','ga','ba'];
     
    function Decoder(bytes, port) {
      let
        str   = String.fromCharCode.apply(null,bytes),
        astr  = str.split(","),
        regex = /([a-z]+)(\d+)/g,
        paire = [],
        decoded = {te:0,pr:0,hu:0,lu:0,wi:0,w2:0,w3:0,da:0,ts:0,ga:0,ba:0}; // init à zéro pour tous
     
      while (null !== (paire = regex.exec(astr[0]))) {
        decoded[ CodRef[ (paire[1].charCodeAt(0)-97) ] ] = parseInt(paire[2]);
        // ou, si tu ne veux pas utiliser la table CodRef :
        // Object.values(decoded)[ (paire[1].charCodeAt(0)-97) ] = parseInt(paire[2]);
      }
      return decoded;
    }

    sinon tu peux aussi en passer par la fonction JSON.parse() => https://developer.mozilla.org/fr/doc...aux/JSON/parse
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Super, merci à tous!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Utiliser Split avec des valeurs relatives
    Par hoplageis dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/02/2017, 17h41
  2. Impossible d'utiliser DISTINCT avec des types image et ntext
    Par azlinch dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/08/2005, 17h43
  3. Changer plusieur style avec des IDs différents?
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2005, 14h33
  4. Utiliser MySqlAdmin avec des droits utilisateurs sur XP
    Par thorgal85 dans le forum Outils
    Réponses: 2
    Dernier message: 18/03/2005, 12h19
  5. Réponses: 6
    Dernier message: 24/02/2005, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo