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

Python Discussion :

Créer un tableau à plusieurs dimensions


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut Créer un tableau à plusieurs dimensions
    Bonjour à tous,

    Je récolte des données issue de la lecture d'un fichier csv qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TABLE|ACTION|DATE|HEURE|PIECE|CHAMP|LIGNE|VALEUR <--- Entête non présente dans le fichier
     
    SQUOTE|INSERT|01-07-2021|143704|DEVHIL21070001| |SQHNUM|DEVHIL21070001
    SQUOTE|UPDATE|01-07-2021|143758|DEVHIL21070001| |QUODAT|12082021
    SQUOTED|UPDATE|01-07-2021|144844|DEVHIL21070001|1000|QTY|10
    SQUOTED|INSERT|01-07-2021|152017|DEVHIL21070001|2000|ITMREF|STA
    SQUOTED|INSERT|01-07-2021|152017|DEVHIL21070001|2000|QTY|1
    SQUOTE|DELETE|01-07-2021|162821|DEVHIL21070001| |QUODAT|
    SQUOTE|DELETE|01-07-2021|162821|DEVHIL21070001| |SQHNUM|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|1000|ITMREF|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|1000|QTY|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|2000|ITMREF|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|2000|QTY|
    Ce fichier est issue d'une base de données qui réalise une audit par rapport à des actions faites sur des tables et des champs. Je n'ai pas la main sur la structure du résultat. Je dois traiter ce fichier pour mettre à jour une autre base, la mise à jour sera effectué toute les 15mn.

    Je cherche à créer un tableau qui aurait cette forme :
    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
    [
      DATE [
        HEURE [
          TABLE [
            ACTION [ 
              PIECE [ 
                LIGNE [ <-- pour certaine table
                  CHAMP:VALEUR
                  (...)
                ]
              ]
            ]
          ]
        ]
      ]
    ]
    Afin d'optimiser les requêtes sql je souhaite grouper les actions, par exemple avec les 3eme lignes du fichier cela donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO squote(SQHNUM) VALUES("DEVHIL21070001");
    UPDATE squote SET QUODAT= 12082021 WHERE SQHNUM = "DEVHIL21070001";
    UPDATE squoted SET QTY = 10 WHERE SQHNUM = "DEVHIL21070001" AND LIGNE = 1000;
    Ce qui donnerait :
    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
    [
      01-07-2021 [
        143707 [
          SQUOTE [
            INSERT [
              DEVHIL21070001 [
                'SQHNUM' : 'DEVHIL21070001'
                (...)
              ]
            ]
          ]
        ]
        143758 [
          SQUOTE [
            UPDATE [
              DEVHIL21070001 [
                'QUODAT' : '12082021'
                (...)
              ]
            ]
          ]
        ]
        144844 [
          SQUOTED [
            UPDATE [
              DEVHIL21070001 [
                1000 [
                  'qty' : 10
                ]
             ]
           ]
        ]
      ]
    ]
    De cette manière j'aurais juste à parcourir le tableau pour reconstruire les requêtes en respectant l'ordre d'exécution (date, heure).

    Ca c'est la théorie mais dans la pratique je n'y arrive pas En php je n'aurais aucun problème mais je ne pige pas la logique avec python. Est-ce faisable, pertinent ?

    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par flipflip Voir le message
    Ca c'est la théorie mais dans la pratique je n'y arrive pas En php je n'aurais aucun problème mais je ne pige pas la logique avec python. Est-ce faisable, pertinent ?
    La structure de données que vous essayer de fabriquer ressemble aux structures composites qu'on trouve dans les fichiers JSON.

    Avec Python, çà s'écrit en composant listes et dictionnaires.
    Mais ce sont des structures de données arborescentes pas forcément facile à maîtriser sans avoir acquis les bases du langage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Avec Python, çà s'écrit en composant listes et dictionnaires.
    J'ai fais pas mal de test et lu pas mal de doc mais il doit me manquer un petit détail.

    Avec ce code dans ma boucle de lecture du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(evt == "INSERT"):
        tab = [dat[hou["sorder"["INSERT"[ {col:row[7]} ]]]]]
    J'obtiens le message
    tab = [dat[hou["sorder"["INSERT"[ {col:row[7]} ]]]]]
    TypeError: string indices must be integers

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    L'erreur dit juste que dans "sorder"["INSERT"..., "sorder" est la chaine de caractères, "[" ce qui signale qu'on va l'accéder via ses index... et qu'"INSERT" n'est pas un entier qui pourrait servir d'indice.

    Et si vous ne vous en sortez pas, c'est que vous n'êtes pas familier avec les types de bases. Ce qui se soigne a coup de tuto. et d'exercices pour apprendre à maîtriser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Salut,

    Je continue dans la compréhension des list python

    J'arrive à ce code qui déjà ne me sort plus d'erreur :
    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
    elif(evt == "INSERT"):
      if not tab:
       # Dans ce cas tab est vide
       # dat = "11-08-2021"
       # hou = "150700"
       # col = itmref
       # row[7] = '0-10418'
        tab.append([dat, [hou, ["sorder", ["INSERT", [ {col:row[7]} ]]]]])
      else:
       # Dans ce cas tab n'est pas vide
       # dat = "11-08-2021"
       # hou = "150700"
       # col = qty
       # row[7] = 10
        tab.insert(0, [dat, [hou, ["sorder", ["INSERT", [ {col:row[7]} ]]]]])
    Le résultat est
    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
     
    [
      [
        '11-08-2021', [
          '150700', [
            'sorder', [
              'INSERT', [
               {'itmref': '0-10418'}
              ]
            ]
          ]
        ]
      ],
      [
      '11-08-2021', [
        '150700', [
          'sorder', [
           'INSERT', [
            {'qty': 10}
           ]
         ]
        ]
      ]
    ]
    ]
    Alors que j'essaie d'obtenir
    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
     
    [
      [
        '11-08-2021', [
          '150700', [
            'sorder', [
              'INSERT', [
               {'itmref': '0-10418'},
               {'qty': 10}
              ]
            ]
          ]
        ]
      ]
    ]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Avec une liste de listes imbriquées de paires [ a, [ b, [ c, [ d, [....]]]], il faut penser Lisp pour chercher et trouver la liste qui commence par a, b, c et ajouter la différence au même niveau que d. Et ça devrait amener à modifier la représentation pour savoir qui est chainé avec qui...
    => déjà vous avez un soucis de conception.

    Pour le reste pourquoi faire des listes "emboités" plutôt qu'une liste avec [ a, b, c ] comme premier élément (un truc "flat") et la liste des feuilles qui vont avec comme 2ème élément?

    Si on Pythonize, l'ensemble '11-08-2021', '150700', 'sorder', 'INSERT' est un tuple d'immutables qui pourrait être clef d'un dictionnaire associée à une valeur qui serait un objet dictionnaire {'itmref': '0-10418', 'qty': 10}.

    Mais je vous le répète encore, des structures de données composites ne sont simples à maîtriser que si on maîtrise déjà les structures simples. Sinon vous n'allez pas pouvoir concevoir clairement si ce que vous êtes parti à faire va fonctionner et encore moins le faire marcher.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. créer un tableau 2 dimensions avec Malloc
    Par nimportekoi dans le forum C
    Réponses: 14
    Dernier message: 15/11/2006, 13h01
  2. problème avec un tableau à plusieurs dimensions
    Par lelutin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 12h05
  3. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  4. Réponses: 7
    Dernier message: 19/01/2006, 18h57
  5. tableau à plusieurs dimensions
    Par pekka77 dans le forum C
    Réponses: 11
    Dernier message: 07/02/2005, 19h42

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