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
Partager