#1 Le 30/06/2009, à 10:31
- iuchiban
[Résolu] Transposition de fichier texte
Bonjour tout le monde,
J'ai un petit soucis avec un fichier texte.
J'ai fait un script qui me donne un fichier texte contenant sur chaque ligne :
- le nom d'un job
- une suite de 144 valeurs (pas de 10min pour toute la journée)
J'ai mis le pas à 10min afin de pouvoir intégrer le fichier dans un tableau excel qui ne gère que 256 colonnes mais comme à terme je voudrais baisser le pas à 1min, il me faut donc prévoir 1440 colonnes.
Je souhaite donc le transposer pour avoir mes séries en colonnes sachant.
Mes outils à dispo sont shell et PERL (AIX inside).
Merci d'avance.
PS : les scripts PERL que j'ai trouvés ne fonctionnent pas vraiment.
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#2 Le 30/06/2009, à 11:10
- Teofifil
Re : [Résolu] Transposition de fichier texte
Bonjour,
Tu as un autre outil à dispo c'est gcc avec la possibilité de faire un programme soit en C ou C++ (couplé avec QT4 via Qdevelop).
Je ne connais pas perl mais pour QT je te renverrai ici http://forum.qtfr.org/viewtopic.php?pid=58532#p58532 et au lien là :http://www.digitalfanatics.org/projects … ter09.html
Après, avoir des lignes ou des colonnes tout dépend du séparateurs entre les données. Ton fichier texte peut être ligne par ligne simplement lors de sa lecture tu affecteras via C++ le contenu d'une ligne à une colonne dans excel.
En espérant t'avoir aidé.
Dernière modification par Teofifil (Le 30/06/2009, à 11:11)
Hors ligne
#3 Le 30/06/2009, à 11:14
- iuchiban
Re : [Résolu] Transposition de fichier texte
Mes outils à dispo sont shell et PERL (AIX inside).
Pas de gcc dispo (serveur IBM AIX)
Mais merci d'avoir répondu
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#4 Le 30/06/2009, à 11:46
- claudius01
Re : [Résolu] Transposition de fichier texte
Bonjour,
Avec les seuls commandes cat, grep , tr et paste il est possible de passer de
$ cat lignes
1: c1 c2 c3 c4 c5
2: c21 c22 c23
3: c31 c32 c33 c34 c35 c36
à
$ cat colonnes
1: 2: 3:
c1 c21 c31
c2 c22 c32
c3 c23 c33
c4 c34
c5 c35
c36
Il suffit pour cela de :
Créer un fichier correspondant à chaque ligne (d'où le marqueur dd:)
$ cat lignes | grep ^1 | tr ' ' '\n' > colonne1
$ cat lignes | grep ^2 | tr ' ' '\n' > colonne2
...
$ cat lignes | grep ^dd | tr ' ' '\n' > colonnedd
Puis utiliser la commande paste
$ paste colonne1 colonne2 colonne3 ...
Si trop de fichiers colonnedd, passer par un fichier résultat intermédiaire
Je te laisse mettre tout cela dans un script chapeau...
En espérant d'avoir aidé
Cordialement, A+
--
Claudius
Hors ligne
#5 Le 30/06/2009, à 13:48
- Totor
Re : [Résolu] Transposition de fichier texte
Voici une solution fonctionnelle mais pas forcément performante :
#!/bin/bash
# lecture du fichier
nbLigne=0
maxLigne=0
while read -a ligne
do
((nbLigne++))
[ ${#ligne[@]} -gt ${maxLigne} ] && maxLigne=${#ligne[@]}
fichier[${nbLigne}]="${ligne[@]}"
done < fichier1.txt
# transposition
for((cptLigne=0;cptLigne<${maxLigne};cptLigne++))
do
uneLigne="$(for((cptCol=1;cptCol<=nbLigne;cptCol++))
do
ligne=(${fichier[${cptCol}]})
echo -n "${ligne[${cptLigne}]}-"
done)"
echo "${uneLigne%-}"
done
Note : j'ai volontairement positionné le "-" comme séparateur de colonne en sortie.
A titre d'exemple :
En entrée :
1 2 3 4 5
6 7 8 9 10
11 12
13 14 25 16 17 18 19
20
En sortie :
1-6-11-13-20
2-7-12-14-
3-8--25-
4-9--16-
5-10--17-
---18-
---19-
Dernière modification par Totor (Le 30/06/2009, à 13:49)
-- Lucid Lynx --
Hors ligne
#6 Le 30/06/2009, à 14:32
- iuchiban
Re : [Résolu] Transposition de fichier texte
Re bonjour,
Bon ben en mettant mes petits neurones en marche je me suis pondu ça :
#!/bin/ksh
_FICHIER="/tmp/Alban/Planning_Jobs/_LISTE_JOB.txt"
_FIC_FIN="/tmp/Alban/Planning_Jobs/_LISTE_FIN.txt"
_NB_LIGNES=$(wc -l $_FICHIER | awk '{print $1}')
_COMPTEUR=1
_CHAINE=""
while [ $_COMPTEUR -lt 145 ]
do
_FIC_TEMP="/tmp/Alban/Planning_Jobs/_LISTE_JOB.txt$_COMPTEUR"
echo "Traitement de $_FIC_TEMP"
cat _LISTE_JOB.txt | awk '{print $'$_COMPTEUR'}' > $_FIC_TEMP
_LONG_TMP=$(wc -l $_FIC_TEMP | awk '{print $1}')
while [ $_LONG_TMP -gt 1 ]
do
sed '$!N;s/\n/ /' $_FIC_TEMP > $_FIC_TEMP"_bis"
mv $_FIC_TEMP"_bis" $_FIC_TEMP
_LONG_TMP=$(wc -l $_FIC_TEMP | awk '{print $1}')
done
cat $_FIC_TEMP >> $_FIC_FIN
rm $_FIC_TEMP
let "_COMPTEUR += 1"
done
Fonctionne sur un fichier avec 119 lignes et 1441 colonnes et le transpose.
Merci à tous pour les idées
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne