Insérer point virgule dans un fichier

Insérer point virgule dans un fichier - Shell/Batch - Programmation

Marsh Posté le 07-07-2009 à 10:12:06    

Bonjour,
 
Un petit coup de main ne serait pas de refus, je cherche à insérer dans un fichier plat des points virgules pour délimiter mes champs (pour pouvoir le traiter plus facilement en awk par la suite).
Mon fichier contient par exemple ces données :
 
200902050000V9TEST0001
200902060000T1POUR0002
200902070000V2VEHL0001
 
et je voudrais avoir le résultat suivant :
 
2009;02;05;0000;V9;TEST;0001
2009;02;06;0000;T1;POUR;0002
2009;02;07;0000;V2;VEHL;0001
 
Je connais le numéro de colonne où je dois insérer mes point-virgule mais je ne vois pas comment mettre en place mon script shell... peut être avec un sed, mais manque d'habitude.
 
Merci pour votre aide.
Bruno.

Reply

Marsh Posté le 07-07-2009 à 10:12:06   

Reply

Marsh Posté le 07-07-2009 à 10:31:55    

avec un sed :
 

Code :
  1. sed "s/\(....\)\(..\)\(..\)\(....\)\(..\)\(....\)\(....\)/\1;\2;\3;\4;\5;\6;\7/"

Reply

Marsh Posté le 07-07-2009 à 10:43:39    

Parfait !
Merci beaucoup !
 
Par contre si j'ai une champ de 60 caractères, je dois mettre 60 points ?!
(............................................................\)
c'est moche le sed quand même...
 
Bruno.

Reply

Marsh Posté le 07-07-2009 à 10:58:03    

tu dois pouvoir utiliser .{60} au lieu de 60 points je pense... (syntaxe regexp classique)
 
sinon tu peux passer par un awk, et faire des substr(), en fonction de la structure de ta ligne l'un ou l'autre peut être plus lisible:
 

Code :
  1. awk '{print substr($0,1,4)";"substr($0,5,2)";"substr($0,7,2)";"substr($0,9,4)";"substr($0,13,2)";" ... }


 
j'ai pas mis la totale, mais c'est l'idée...

Reply

Marsh Posté le 07-07-2009 à 11:10:55    

OK.
Et ca sert à quoi la série de chiffre après : \1;\2;\3;\4;\5;\6;\7/
Car là j'ai 59 colonne donc j'ai fais :
........\)/\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;\48;\49;\50;\51;\52;\53;\54;\55;\56;\57;\58;\59/"
 
mais ca me découpe pas mon fichier comme je veux, ca me duplique des colonne j'ai l'impression..

Reply

Marsh Posté le 07-07-2009 à 11:17:27    

les \1 \2 etc servent à rappeler le résultat de ce qui a été variabilisé grace à \(....\) dans la première partie du sed...
 
c pour servir plusieurs fois ce script? parce que sinon, si c du one-shot sur un gros fichier, tu peux utiliser excel. tu mets tout dans une colonne, données> convertir> taille fixe> valider, puis un export en csv et roule raoul.

Reply

Marsh Posté le 07-07-2009 à 11:23:10    

impossible, mon fichier fait plusieurs 100 aine de milliers de ligne...

Reply

Marsh Posté le 07-07-2009 à 11:25:55    

j'ai compris mon souci, les variables à 2 chiffres me posent problème, exemple avec \15;
ca me ressort la variable \1 + le chiffre 5
au lieu de ressortir la variable \15
une idée !?

Reply

Marsh Posté le 07-07-2009 à 11:28:37    

prog_bl a écrit :

impossible, mon fichier fait plusieurs 100 aine de milliers de ligne...


 
arf. effectivement excel va être limité.
 

prog_bl a écrit :

j'ai compris mon souci, les variables à 2 chiffres me posent problème, exemple avec \15;
ca me ressort la variable \1 + le chiffre 5
au lieu de ressortir la variable \15
une idée !?


 
je me demande si cette syntaxe n'est pas limitée a 9 variables... si oui, je dirais que tu est obligé de le faire n plusieurs fois, mais ca va devenir limite chiant... du coup, je te conseillerais limite le awk qui restera peut être plus lisible et maintenable.

Reply

Marsh Posté le 07-07-2009 à 11:40:05    

ou le faire en 2 fois

Reply

Marsh Posté le 07-07-2009 à 11:40:05   

Reply

Marsh Posté le 07-07-2009 à 11:48:31    

4get9 a écrit :

ou le faire en 2 fois


ben plutot 6 vu qu'il a une 60aine de champs...

Reply

Marsh Posté le 07-07-2009 à 12:33:11    

oups j'avais cru lire 15 :D
effectivement 6 fois

Reply

Marsh Posté le 07-07-2009 à 14:54:26    

Parfait ! Ca marche !
 
J'ai du faire 8 sed en fait, car la variable 1 sert pour la ligne précédente, donc on ne récupère que 8 variables à chaque fois : 8*7=56 et 8*8=64, et comme j'ai 59 colonnes = 8 sed !
Le compte est bon, on peut passer aux lettres !
 
Merci à tous !

Reply

Marsh Posté le 07-07-2009 à 15:22:38    

toutoum toum touumm...        toutoum toum.
 
 
http://medias.francetv.fr/bibl/url_images/2006/09/27/image_24655777.jpg

Reply

Marsh Posté le 11-07-2009 à 19:19:51    

prog_bl a écrit :

Parfait ! Ca marche !
 
J'ai du faire 8 sed en fait, car la variable 1 sert pour la ligne précédente, donc on ne récupère que 8 variables à chaque fois : 8*7=56 et 8*8=64, et comme j'ai 59 colonnes = 8 sed !
Le compte est bon, on peut passer aux lettres !
 
Merci à tous !


 
T'aurais pu le faire en une fois avec un bon script Python (ou perl)
 

Code :
  1. #!/usr/bin/env python
  2. fp=open("fichier", "r" )
  3. for line in fp:
  4.     print "%s;%s;%s;%s;%s; ....... (etc autant qu'il faut de colonnes) " % (line[0:5], line[5:12], line[12:18], ... etc )
  5. fp.close()


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed