1 votes

Comment puis-je utiliser l'éditeur vim pour formater le texte comme ceci ?

J'ai un fichier data.txt, le format des données est quelque chose comme ceci :

a|Êó•
a|Êõ
a|Ôõ
a|Ôùã
aa|Êòå
aa|Êòç
aaa|Êô
aamh|Êöò

Je voudrais simplement convertir le texte suivant en ce résultat :

'a' => ['Êó•','Êõ','Ôõ','Ôùã'],
'aa' => ['Êòå','Êòç'],
'aaa' => ['Êô'],
'aamh' => ['Êöò']

Des idées à ce sujet ? Merci.

4voto

user2013 Points 2301

Une solution perl

#!/usr/bin/perl

use strict;
use warnings;

my $key = 'a';
my @data = ();

while(<>) {  
    chomp($_);
    my $line = $_;

    my ($k, $d) = split(/\|/, $line);

    if($k eq $key) {
        push(@data, $d);
    } else {
        my $text = join ',', map { qq/'$_'/ } @data;
        print "'$key' => [$text],\n";
        @data = ();
        push(@data, $d);
        $key = $k
    }
}
# this prints out any data still left
my $text = join ',', map { qq/'$_'/ } @data;
print "'$key' => [$text],\n";

0voto

Wes P Points 3153

Viml peut être le bon outil pour le travail : parfois (par exemple Ms Windows) il est plus facile d'installer vim qu'une boîte complète perl/*nix.

" Parse the lines
let dict = {}
let lines=getline(1,'$')
call filter(lines, 'v:val =~  ".*|.*"')
for l in lines
  let [k,v] = split(l, '|')
  if has_key(dict, k)
    let dict[k] += [v]
  else
    let dict[k] = [v]
  endif
endfor
" produce the new lines ...
" ...in a new buffer
vnew
let res = []
for [k,ll] in items(dict)
  let l = string(k) . ' => ' . string(ll)
  let res += [l]
endfor
let sres=join(res,",\n")
put=sres

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X