Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1462 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Insérer point virgule dans un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Insérer point virgule dans un fichier

n°1903016
prog_bl
Posté le 07-07-2009 à 10:12:06  profilanswer
 

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.

mood
Publicité
Posté le 07-07-2009 à 10:12:06  profilanswer
 

n°1903031
pataluc
Posté le 07-07-2009 à 10:31:55  profilanswer
 

avec un sed :
 

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

n°1903044
prog_bl
Posté le 07-07-2009 à 10:43:39  profilanswer
 

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.

n°1903056
pataluc
Posté le 07-07-2009 à 10:58:03  profilanswer
 

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

n°1903063
prog_bl
Posté le 07-07-2009 à 11:10:55  profilanswer
 

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

n°1903067
pataluc
Posté le 07-07-2009 à 11:17:27  profilanswer
 

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.

n°1903072
prog_bl
Posté le 07-07-2009 à 11:23:10  profilanswer
 

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

n°1903074
prog_bl
Posté le 07-07-2009 à 11:25:55  profilanswer
 

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 !?

n°1903078
pataluc
Posté le 07-07-2009 à 11:28:37  profilanswer
 

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.

n°1903090
4get9
C'est clair !
Posté le 07-07-2009 à 11:40:05  profilanswer
 

ou le faire en 2 fois

mood
Publicité
Posté le 07-07-2009 à 11:40:05  profilanswer
 

n°1903097
pataluc
Posté le 07-07-2009 à 11:48:31  profilanswer
 

4get9 a écrit :

ou le faire en 2 fois


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

n°1903115
4get9
C'est clair !
Posté le 07-07-2009 à 12:33:11  profilanswer
 

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

n°1903197
prog_bl
Posté le 07-07-2009 à 14:54:26  profilanswer
 

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 !

n°1903216
pataluc
Posté le 07-07-2009 à 15:22:38  profilanswer
 

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

n°1904628
Sve@r
Posté le 11-07-2009 à 19:19:51  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Insérer point virgule dans un fichier

 

Sujets relatifs
parser un fichier XMLLire un fichier CSV de 170Mo avec Access
traitement d'un fichierconvertir un fichier texte en fichier XML
Script de téléchargement de fichierhelp me, script pour AD boite de dialogue et généré fichier
[ksh] Ecrire sans fichier temporairevisual 2005 et fichier redist
ouvrir un fichier avec pour nom un stringstreamParser fichier XML
Plus de sujets relatifs à : Insérer point virgule dans un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR