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