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

Shell et commandes GNU Discussion :

Comment faire un split avec comme séparateur une Tabulation en Bash pour peupler un tableau 2d?


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Comment faire un split avec comme séparateur une Tabulation en Bash pour peupler un tableau 2d?
    Bonjour à tous,

    Je bataille depuis un moment pour faire un split à l'aide du caractère Tabulation sur un fichier. J'ai essayé plusieurs méthodes sans succès.
    Je bloque toujours sur le même phénomène quand j'ai plusieurs tabulation qui s’enchaîne.
    Par exemple pour la ligne 2 du tableau ci-dessous j'obtiens :
    Array[1,0]=1
    Array[1,1]=2
    Array[1,2]=3
    Du coup, j'ai toutes mes colonnes qui se mélange :/

    Mon besoin est le suivant :

    Fichier Entrée
    ColonneA TAB ColonneB TAB ColonneC TAB ColonneD
    1 TAB 2 TAB "" TAB 3
    1 TAB "" TAB "" TAB 3
    Nota : Remplacer TAB par une tabulation

    Tableau de sortie
    Array[0,0]=ColonneA
    Array[0,1]=ColonneB
    Array[0,2]=ColonneC
    Array[0,3]=ColonneD
    Array[1,0]=1
    Array[1,1]=""
    Array[1,2]=2
    Array[1,3]=3
    Array[2,0]=""
    Array[2,1]=""
    Array[2,2]=""
    Array[2,3]=1

    Si vous avez des idées, elles sont les bienvenus !!
    Sinon, je vais me faire ce bout de code sous Excell

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    avec bash4, et un tableau associatif...
    ?
    Code non-testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare -A aArray
    while IFS=$'\t' read -a ar
    do
       for ((i=0;i<4;i++))
       do
          aArray[$((n++)),$i]="${ar[i]}"
       done
    done < fichierTab
    ça doit pas être très loin de ce qu'on pourra faire avec awk.

    mais je ne suis pas certain de l'utilité de requérir à un tableau 2D; as-tu besoin du tableau après la lecture du fichier ? ne peux-tu traiter les données de la manière que tu le souhaites lors de la lecture de chaque ligne ?
    dis-nous en plus, s'il te plait.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour ta réponse

    Un peu plus de détails :
    J'ai un fichier d'export d'un logiciel indus qui me sort plus d'une quarantaine de colonne. Chaque colonne est séparé par une Tab. Et chaque colonne n'est pas forcément rempli. J'ai le cas ou j'ai plusieurs tabulations qui s’enchaîne (le cas qui m’embête).
    Je souhaite garder le tableau en 2d pour faire des traitements postérieurs à la mise en forme. Au final je vais avoir un tableau de 10 colonnes, et sur chacune de ces 10 colonnes je vais faire un contrôle syntaxique différents.
    Après il est vrai que je dois pouvoir me débrouiller à faire le traitement sans tableau 2d.

    J'ai tapé ton code que j'ai adapté pour ma compréhension (c'est mon troisième script en bash ...). Tu m'as lâché avec le n++

    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
    #! /bin/bash
     
      declare -A aTabAlm	# Tableau spit tab
      OLD_IFS="$IFS"
      let j=0
      while IFS=$'\t' read -a ar
      do
        echo "NVL LIGNE"
        for ((i=0;i<50;i++))
        do
          aTabAlm[$j,$i]="${ar[i]}"
          echo ${aTabAlm[$j,$i]}
        done
        let j=$j+1
      done < $sChemin
    Le résultat que j'obtiens ne prends pas en compte l’enchaînement des tabulations.

    Fichier Entrée
    ColonneA TAB ColonneB TAB ColonneC TAB ColonneD
    1 TAB 2 TAB "" TAB 3
    1 TAB "" TAB "" TAB 3

    Tableau de sortie
    ColonneA TAB ColonneB TAB ColonneC TAB ColonneD
    1 TAB 2 TAB 3 TAB ""
    1 TAB 3 TAB "" TAB ""

    Nota : Remplacer TAB par une tabulation

    J'ai essayé avec awk hier, mais je me suis noyé dans ces méandres... Et vue que je souhaite faire du traitement derrière, je pense que je vais ramer si j'utilise awk. C'est un langage à part entière ! Je souhaiterais m'en sortir avec du bash, si c'est possible.
    Je ne sais pas quelle version de bash j'utilise, je tourne sur la dernière distri d'OpenSuse.

    C'est peut être le caractère Tab qui nous embête, je vais essayé de voir si j'arrive à le remplacer par "|" mais bon j'ai lue que sed ne prend pas en compte les Tab !

    Edit :
    Je viens d'essayer en remplaçant \t par \011 (valeur en Ascii) même punition

    Edit2 :
    YouHou !!!
    J'ai réussi a contourner cette histoire de Tab en faisant un sed sur une Tab

    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
      declare -A aTabAlm	# Tableau spit tab
      OLD_IFS="$IFS"
      let j=0
      sed s/"\t"/\|/g Essai > Resu
      while IFS=$'\|' read -ra ar
      do
        echo "NVL LIGNE"
        for ((i=0;i<50;i++))
        do
          aTabAlm[$j,$i]="${ar[i]}"
          echo ${aTabAlm[$j,$i]}
        done
        let j=$j+1
      done < Resu
    unset aTabAlm
    Comment peut on optimiser ce bout de code en supprimant la création du fichier Résu ?

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Fichier Entrée
    ColonneA TAB ColonneB TAB ColonneC TAB ColonneD
    1 TAB 2 TAB "" TAB 3
    1 TAB "" TAB "" TAB 3

    Tableau de sortie
    ColonneA TAB ColonneB TAB ColonneC TAB ColonneD
    1 TAB 2 TAB 3 TAB ""
    1 TAB 3 TAB "" TAB ""
    les tableaux associatifs sont hashés, si bien que l'ordre d'inscription dans le tableau n'est pas respecté, et les indices ne sont pas triés en fonction de leur valeur

    Comment peut on optimiser ce bout de code en supprimant la création du fichier Résu ?
    avec un substitution de processus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while IFS=$'\|' read -ra ar
    do
       : ...
    done < <(sed 's/\t/|/g' Essai)
    Je souhaite garder le tableau en 2d pour faire des traitements postérieurs à la mise en forme.
    mise en forme ?

    Au final je vais avoir un tableau de 10 colonnes, et sur chacune de ces 10 colonnes je vais faire un contrôle syntaxique différents.
    cela peut être fait lors de la lecture de chaque ligne, avec un tableau simple, qui sera (évidemment) réinitialisé à chaque ligne, mais qui pourra être enregistré dans un autre tableau, ou une variable "plate".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Candidat au Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta contribution, le sujet est résolu pour ma part

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2013, 19h03
  2. Réponses: 7
    Dernier message: 05/12/2008, 09h26
  3. comment faire l'appel avec main d'une classe
    Par Platon93 dans le forum Général Java
    Réponses: 2
    Dernier message: 24/04/2008, 16h15
  4. Réponses: 3
    Dernier message: 03/10/2007, 00h59
  5. comment faire un sphère avec une texture ?
    Par fregate dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/09/2005, 03h37

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