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 :

Traiter les champs d'un fichier conséquent


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Traiter les champs d'un fichier conséquent
    Bonjour,

    Je dispose d'un fichier csv assez conséquent (100.000 lignes pour 150 colonnes environ)
    Chaque ligne représente un ensemble de données.
    Je souhaite créer nbColonnes - 1 fichiers représentants la liste des valeurs de chacun de ces champs(sans doublon) suivant le champ n°6 par exemple.
    J'ai tenté deux essais (un avec "awk" & "sed", l'autre avec "cut") mais le traitement reste tres lent (+ de 5minutes pour "cut" et bcp plus pour l'autre technique).

    Voici mes deux codes

    Code essai avec sed & awk : 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
    #!/bin/sh
    #
    # Copyright (c) 2007, by bibi
    # All rights reserved
     
    fichier=$1
    constructeur=$2
    societe=$3
     
     
    # Suivant le type de constructeur, la liste des index des champs ainsi que la position
    # à laquelle se trouve l'indice représentant le type de ticket ne sont pas les mêmes.
     
    nbLignes=`wc -l $fichier | awk -F" " '{printf $1}'`;
    echo $nbLignes
    indice=1
    case $constructeur in
        a) 
            indiceTypeTicket=6
    	nbChamps=170
    	while [ $indice -lt nbChamps ]
    	do		
    	    echo "ticket : $indice"
    	    sed "$indice!d" $fichier > ligne.tmp
    	    for i in 7 8 9 10 ... 170 
    	    do
      		val=`eval awk -F\\"\\;\\" \\'\\{print \\$$indiceTypeTicket\\,\\$$i}\\' ligne.tmp | sort -u >> $HOME/$constructeur/$societe/$i.champ`
    	    done
    	    (( indice = indice + 1))
    	done
    	break
    	;;
        b)
    	...
            # quasiment la même chose
    	break
    	;;
        c)
    	...
            # quasiment la même chose
    	break
    esac


    Code avec cut : 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
     
    #!/bin/sh
    #
    # Copyright (c) 2007, by bibi
    # All rights reserved
    # Script permettant de mettre à jour les fichiers décrivants la liste des valeurs possibles des champs d'un ticket
    # Il prends en paramètre un fichier décrivant un ensemble de tickets, le constructeur et la société pour ces tickets.
     
    fichier=$1
    constructeur=$2
    societe=$3
     
     
    # fonction qui met à jour les fichiers décrivants la liste des valeurs possibles pour tous les
    # champs du fichier en argument
    miseAJourListe()
    {
        echo "champ : $i"
        cut -d";" -f $1,$indiceTypeTicket $fichier | sort | uniq >> $HOME/$constructeur/$societe/$1.champ
    }
    #
     
    # Suivant le type de constructeur, la liste des index des champs ainsi que la 
    # position à laquelle se trouve l'indice représentant le type de ticket ne sont pas les mêmes.
    case $2 in
        a) 
            indiceTypeTicket=6
    	for i in 7 8 9 ... 170
    	do
      	    miseAJourListe $i
    	done
    	break
    	;;
        b)
    	...
            # quasiment la même chose
    	break
    	;;
        c)
    	...
            # quasiment la même chose
    	break
        *)
    	echo "Erreur constructeur"
    	break
    	;;
    esac


    Je ne sais que faire.... J'ai tenté une solution en java qui n'a pas été concluante et j'hésite à passer au C


    EDIT: Un exemple de ce que je souhaiterais

    le fichier est
    a;b;c
    0;2;5
    1;7;3
    1;5;3

    et je voudrais 2 fichiers
    1er fichier:
    c;a
    5;0
    3;1
    2eme fichier
    c;b
    5;2
    3;7
    3:5

    ReEDIT: J'ai oublié de préciser que c'est le "sed" qui fait traîner le premier script

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par darkrio
    Un exemple de ce que je souhaiterais

    le fichier est
    a;b;c
    0;2;5
    1;7;3
    1;5;3

    et je voudrais 2 fichiers
    1er fichier:
    c;a
    5;0
    3;1
    2eme fichier
    c;b
    5;2
    3;7
    3:5

    Si j'ai bien compris, morceau de code qui doit marcher
    http://lea-linux.org/cached/index/Dev-awk.html

    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
     
    .../...
    TotEnreg=`wc -l < $fichier`
    case $constructeur in
        a) 
      	awk -F";" -v TotEnreg=$TotEnreg -v indiceTypeTicket=3 '
    	{
    		Ind=0
    		while (Ind < NF) {
    			Ind++
    			if (Ind == indiceTypeTicket) {
    				continue
    			}
    			EdInd=sprintf("%3.3d",Ind)
    			OutFile=EdInd".champ"
    			print $indiceTypeTicket";"$Ind > OutFile
    			if (NR == TotEnreg) {
    				system("sort -u -o "OutFile" "OutFile)
    			}
    		}
    	} ' $fichier
    .../...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Merci, mais ton script est encore trop lent (plus lent que celui utilisant cut)
    Est-il donc possible d'ecrire un script plus rapide ou me conseillez vous de passer à un programme en C

Discussions similaires

  1. Extraire les "champs" d'un fichier texte
    Par Bamba Aboubacar dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 05/11/2014, 17h31
  2. Les champs d'un fichiers CSV
    Par belfort90 dans le forum Débuter
    Réponses: 3
    Dernier message: 13/08/2013, 11h32
  3. Réponses: 4
    Dernier message: 03/07/2009, 14h19
  4. [PHP-JS] lire les champs d'un fichier excel
    Par cortex59 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/05/2008, 14h11
  5. [VB 6.3] Traiter les données d'un fichier
    Par yaya54 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 21/02/2006, 14h00

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