Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

[Vi]

Mathieu, le lundi 20 mars 2006 à 12:09:23 
 Signaler ce message aux modérateurs

Bonjour,

Je cherche a inserer des tabulations dans un fichier de données afin d'en faciliter la lecture, et ce facon automatique. Mes champs sont de longueur fixe.

Sauriez vous s'il existe une comande Vi qui premettrait de le faire, ou a défaut auriez vous une idée de scripts ?

Merci d'avance...

1

vi4ever, le lundi 20 mars 2006 à 12:58:55

Par exemple pour en mettre une après chaque mot TITI sans effacer la fin de la ligne

vi -c "S/TITI.*/ &/" nomdufichier

le plus simple pour adapter à ton besoi et de consulter le
"Guide de survie sous VI"

http://matrix.samizdat.net/pratique/documentation/guide-survie-VI.html

Répondre à vi4ever

2

Mathieu, le lundi 20 mars 2006 à 14:19:55

Merci pour ta réponse, mais concretement, je n'ais pas de chaine distinctive... Comme les exemples sont souvent mieux que les ecris je veux faire ca:

fichier de données avec 3 colonnes (ou plus)
1ere : 4 caracteres = 1,05
2eme : 5 = 22,01
3ème : 1 = Y

ca donne :
1,0522,01Y

et je veux :
1,05 22,01 Y

Pour info, j'ai beaucoup de lignes... et beaucoup de colones

Merci de vos aides...

Répondre à Mathieu

3

[Dal], le lundi 20 mars 2006 à 16:58:21

Salut,

tu peux utiliser sed.

Avec ton exemple, celà donne :

$ echo "1,0522,01Y" | sed 's/\(.\{4\}\)\(.\{5\}\)\(.\{1\}\)/\1       \2      \3/'
$ 1,05    22,01   Y

Une fois que tu as établi ton filtre sed, tu peux traiter tout un fichier avec le paramètre -i
$ sed -i old 's/\(.\{4\}\)\(.\{5\}\)\(.\{1\}\)/\1       \2      \3/' monfichier.txt

L'ancienne version sera renommée monfichier.txt.old


Dal

Répondre à [Dal]

4

[Dal], le lundi 20 mars 2006 à 17:08:18

L'expression est compatible avec vi

Donc tu peux aussi faire :

:%s/\(.\{4\}\)\(.\{5\}\)\(.\{1\}\)/\1       \2      \3/

Dal

Répondre à [Dal]

5

Mathieu, le lundi 20 mars 2006 à 17:46:20

C'est fantastique, c'est exactement ce qu'il me fallait...

MAIS... Mon fichier a 60 champs -> VI me renvoit "E51 : trop de \("

:(

Y a t'il une autre solution ? Combien de \ accepte VI ? Je pourrais tjs essayer de faire 2 ou 3 passes mais...

PS : sur sed, ca marcherait ?
PS2 : je suis sur un PC Windows... :(

Répondre à Mathieu

6

jipicy, le lundi 20 mars 2006 à 19:09:19

Salut,

PS : sur sed, ca marcherait ?
http://gnuwin32.sourceforge.net/packages/sed.htm Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé. 

Répondre à jipicy

7

[Dal], le lundi 20 mars 2006 à 20:14:13

60 champs, celà en fait des parenthèses et des slashs... et si ton format change un peu, tu ne t'y retrouves plus.

Tu as intérêt à faire un petit programme pour çà.

Par exemple, en Perl :

#!/usr/bin/perl

@fields = (3,8,9);
$st = "";
$o = "0";

open(FICH, "data.txt");
while (<FICH>) {
  for ($n=0; $n<(length($_)-1); $n++) {
    $st .= substr($_, $n, 1);
    if ($fields[$o] eq $n) {
      $st .= chr(9); $o++;
    }
  }
  print "$st\n"; $st = ""; $o = "0";
}
close(FICH);

@fields est un tableau contenant les positions sur la ligne des caractères après lesquels une tabulation doit être insérée (le premier caractère étant à la position 0).


Dal

Répondre à [Dal]

11

vi4ever, le mardi 21 mars 2006 à 09:59:19

Forcément sed appelant vi .....

Répondre à vi4ever

8

lami20j, le lundi 20 mars 2006 à 21:01:24

Bonsoir à tous,

Si j'ai bien compris : Après chaque 4 , 5 et 1 caractère on doit mettre une tabulation.

En ce cas je propose cette solution :

#! /usr/bin/perl

use warnings;
use strict;

while (<DATA>){
  my $l = length;
  print join "\t",unpack("A4A5A1" x ($l/10),$_),
                  substr($_,-($l-(int($l/10))*10)),"\n";
}


__END__
1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y3,9999,77A0
1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Yaaa
2,0522,01Z2,0522,01Z2,0522,01Z2,0522,01Z2,0522,0

Resultat
[lamitest@localhost corbeille]$ perl ccm_vi.pl
1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       3,99    99,77   A       0

1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       aaa

2,05    22,01   Z       2,05    22,01   Z       2,05    22,01   Z       2,05    22,01   Z       2,05    22,01   Z



[lamitest@localhost corbe

Resultat pour Dal
[lamitest@localhost corbeille]$ perl ccm_dal_vi.pl
1,05    22,01   Y       1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y3,9999,77A0
1,05    22,01   Y       1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Yaaa
2,05    22,01   Z       2,0522,01Z2,0522,01Z2,0522,01Z2,0522,01Z

[lamitest@localhost corbei


En fait j'ai separe par 4,5 et 1 et ensuite j'afiche ce qui reste de chaine (disons qu'on a 63 caractères). Donc j'affiche 4+5+1 6 fois plus les 3 dernières.

Répondre à lami20j

9

lami20j, le lundi 20 mars 2006 à 21:29:13

Re,

et même

#! /usr/bin/perl

use warnings;

while (<DATA>){
  s/(.{4})(.{5})(.)/$1\t$2\t$3\t/g;
  print;
}


__END__
1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y3,9999,77A0
1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Y1,0522,01Yaaa
2,0522,01Z2,0522,01Z2,0522,01Z2,0522,01Z2,0522,01Z

Resultat
[lamitest@localhost corbeille]$ perl ccm_vi_2.pl
1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       3,99    99,77   A       0
1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       1,05    22,01   Y       aaa
2,05    22,01   Z       2,05    22,01   Z       2,05    22,01   Z       2,05    22,01   Z       2,05    22,01   Z

[lamitest@localhost corbeille]$

Répondre à lami20j

10

[Dal], le mardi 21 mars 2006 à 09:23:34

Salut Lami20j,

En fait, comme l'a indiqué Mathieu dans son post <5> ( http://www.commentcamarche.net/forum/affich-2154672-vi#5 ), son fichier de données a 60 champs, qui sont de longueur variable (l'exemple donné étant limité à 3 champs) et sans période particulière, semble-t-il.

C'est pourquoi j'ai proposé dans mon script en post <7> ( http://www.commentcamarche.net/forum/affich-2154672-vi#7 ) la création d'un tableau qui contient les positions des champs. Celà me semble être plus facile à gérer (et à faire évoluer si la structure des données venait à changer), plutôt que de coder en dur les sélections à faire sur 60 positions (sous forme d'une expression rationnelle ou autrement).

Il suffit de compléter les 60 positions dans le tableau @fields.


Dal

Répondre à [Dal]

12

lami20j, le mardi 21 mars 2006 à 12:21:09

Salut Dal,

je comprends ton raisonement. Donc ne tiens pas compte de ce que j'ai dit dans mon message N° 8.

En fait le plus important c'est que TMTOWTDI et Mathieu n'a qu'a choisir la solution que lui convient.

En général je propose d'autres solutions (je parle de Perl) exactement dans cet esprit et en plus je m'entraîne, et je n'ai jamais pensé que ma solution est la meilleure.

Moi aussi j'ai pris note de ta solution mais je me suis arrêtre au 3 champs, donc je n'ai pas vu plus loin (mea culpa).

lami20j

P.S. Mes solutions ne tiennent pas compte de nombre de champs (donc minimum 3 champs.......)

Répondre à lami20j

13

[Dal], le mardi 21 mars 2006 à 14:41:47

Salut Lami20j,

Tu as raison, surtout avec Perl, il y a toujours de multiples façons de traiter un problème.

A vrai dire, j'aime bien ton idée d'utiliser unpack avec join (j'avais d'ailleurs initialement pensé à utiliser split avec join, mais l'expression sur 60 positions ne m'attirait pas trop). Elle exploite mieux les spécificités de Perl. De plus, elle utilise la longueur de chaque champ (ce qui semble être l'information dont dispose Mathieu), et non leur position.

Celà fait aussi un code plus court, et le format de description de la structure reste relativement lisible "A4A5A1..." (pas vraiment moins qu'un tableau).

Pour répondre à la question de Mathieu avec ta méthode, on pourrai faire comme çà :

$stFieldsTemplate = "A4A5A1";

à compléter sur les 60 positions avec la suite des Axx..., puisqu'elles sont arbitraires et en tout cas non périodiques, et dans la boucle un simple :

print join "\t",unpack($stFieldsTemplate,$_); print "\n";

Ton avis m'intéresse, mon utilisation de Perl n'étant pas aussi avancée, et tes interventions sur ce langage étant toujours très instructives :)


Dal

Répondre à [Dal]

14

lami20j, le mardi 21 mars 2006 à 17:02:12

Re,

Pour suivre ton raisonnement, on pourra même créer une fonction

sub coup2format {


}

qui pourra être utiliser un peu dans la manière que ton tableau @fields, avec la difference qu'on va utiliser unpack et les valeurs utiliser seront des arguments pour la fonction et pas des éléments d'un tableau.
while (<FIC>){
    coup2format(arg1,arg2,arg3,......);
}
Et tu ça pour la paresse dont on parle en Perl (on evite de taper A4A5A1.....)

Une autre posibilité qui me vient à l'esprit c'est de couper la chaîne par 10caractères, et ensuite de traiter le bloc de 10(en 4,5,1), et ce qui reste si longuer > 4 et <=9 (4,5 ou le reste) et si <= 4 (4 ou le reste).

Répondre à lami20j

15

 Mathieu, le mardi 21 mars 2006 à 17:20:38

Merci a tous pour votre aide préciseuse, et surtout vos bonnes idées...

J'ai resolu mon problème... avec VI...

Je sens par contre, qu'il va falloir que je me mettes au perl un de ces jours... C'est tout de meme plus puissant que les scripts VI...

Répondre à Mathieu
Linux - L'éditeur Vi Introduction à Vi Vi est un des éditeurs de texte les plus populaires sous les systèmes de type Unix (avec Emacs et pico) malgré son ergonomie très limitée. Sous Linux il existe une version libre de Vi appelée Vim (Vi Improved). Vi (prononcez... www.commentcamarche.net/contents/linux/linvi.php3
Linux - L'éditeur Vi Introduction à Vi Vi est un des éditeurs de texte les plus populaires sous Linux (avec Emacs et pico) malgré son ergonomie très limitée. En effet, Vi (prononcez Vihaille) est un éditeur entièrement en mode texte, ce qui signifie que chacune des... www.commentcamarche.net/contents/tutlinux/linvi.php3
Télécharger Tweak VI Tweak VI Basic est un utilitaire permettant d'optimiser et de personnaliser Windows Vista. Voici un aperçu des fonctionnalités de Tweak VI: Activation de centaines de paramètres cachés de Windows vista Nettoyage de la base de registre ... www.commentcamarche.net/telecharger/telecharger-34055069-tweak-vi
[vi/vim] Rechercher un motAfin de rechercher un mot sous Vi/Vim, il suffit de taper "/" ou "?", suivi du mot à rechercher afin de lancer la recherche respectivement vers le bas ou vers le haut. Une pression sur la touche "n" permet d'aller directement à l'occurence... www.commentcamarche.net/faq/sujet-865-vi-vim-rechercher-un-mot
Raccourcis clavier Vi(m)L'éditeur de texte Vi (VIM - Vi amélioré) - Raccourcis clavier I. Les modes d'exécution II. Le mode commande 1. Le déplacement Les Caractères Le texte Les lignes 2. Recherche 3. Numérotation de lignes 4. Modification, suppression III.... www.commentcamarche.net/faq/sujet-8400-raccourcis-clavier-vi-m
Petit tuto sur VI/VIMExtraits du tutoriel de VIM =============================================================================== B i e n v e n u e dans le T u t o r i e l de V I M - Version 1.5.fr.2... www.commentcamarche.net/faq/sujet-7961-petit-tuto-sur-vi-vim
Multiplier fichier vi avec un shell (Résolu)Bonjour, j'ai une liste de chiffres (en colonne) dans un fichier vi. j'aimerais tous les multiplier et créer ainsi un nouveau fichier. je pensais le faire grâce à un shell. Est-ce possible? j'arrive à copier élément par élément mais pas... www.commentcamarche.net/forum/affich-6062146-multiplier-fichier-vi-avec-un-shell
Ou acheter un linker Dstti ou EZ-Flash Vi ?Bonjour, Voilà je souhaiterai acheter un linker DSTTI ou EZ Flash Vi mais je ne sais pas ou en trouver. Sur le net quel site me conseillez vous ? le moins cher si possible mais qui ne soit pas un site d'arnaque. Et sinon peut on en trouver dans des... www.commentcamarche.net/forum/affich-11926113-ou-acheter-un-linker-dstti-ou-ez-flash-vi
Ez flash vi pour dsi écran blancBonjour, j'essaie de faire marcher la ez-flash vi sur mon dsi..quand jappuie sur l'icone de ezflash vi, il load seulement le programme une fois sur 10, et quand il le load, il freeze toujours sur le loading screen ou sur un écran blanc (la plupart du... www.commentcamarche.net/forum/affich-12658992-ez-flash-vi-pour-dsi-ecran-blanc
Télécharger Free Video to MP3 ConverterCe logiciel permet d'extraire simplement la bande-son d'un fichier video au format Mp3 (uniquement). Le logiciel prend en charge les formats d'entrée suivants : flv, avi, mpeg, mpg, mpe, mp4, m4v, wmv, asf, mov, qt, 3gp2, 3gpp, 3gp, 3g2. L'extraction... www.commentcamarche.net/telecharger/telecharger-34055211-free-video-to-mp3-converter
Télécharger Pilotes VIA AC'97Le pilote VIA AC'97 sound driver convient pour toutes les cartes-mères embarquant un chipset VIA. La liste complète des chipsets supportés est la suivante : VIA AC97 codec incorporated into VT82C686A/B South Bridges ( VT82C686A VT82C686B ) VIA... www.commentcamarche.net/telecharger/telecharger-34056547-pilotes-via-ac-97
Télécharger Riva FLV encoderRiva FLV encoder permet de transcoder vos fichiers vidéo au format advanced Flash Video (FLV). Riva FLV encoder supporte l'encodage des formats suivants : AVI, MPEG, Quicktime, WMV : AVI Cinepak Codec by Radius, Cinepak by Supermac Intel... www.commentcamarche.net/telecharger/telecharger-34055237-riva-flv-encoder