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:
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:
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