reformater en vim pour une bonne disposition de la colonne

J’ai cet dataset dans un fichier csv

1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425 1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504, 0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153 1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644, 0.00078635, 0.000730052, 0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669, 0.00230171, 0.00217917 

Comme vous pouvez le voir, les numéros sont formatés différemment et mal alignés. Y at-il un moyen dans vim d’aligner rapidement les colonnes correctement, de sorte que le résultat est le suivant

 1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425 1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504,0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153 1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644,0.00078635, 0.000730052,0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669,0.00230171, 0.00217917 

Ce serait bien de copier et coller des sections avec ctrl-v. Des indices?

Si vous utilisez un système UNIX (Linux, etc.), vous pouvez le sortingcher et le filtrer via la commande column (1):

 :%!column -t 

Parfois, nous voulons seulement aligner deux colonnes. Dans ce cas, nous n’avons pas besoin de plug-ins et pouvons utiliser les fonctionnalités de Vim telles que:

  1. Choisissez un séparateur. Dans la publication d’OP, il s’agit d’une virgule, dans mon exemple, c’est = .
  2. Ajoutez des espaces avant / après. J’utilise s/=/= ...spaces... / dans la sélection visuelle pour cela.
  3. Localisez le mot le plus long et placez le curseur après.
  4. Supprimez tous les espaces blancs supplémentaires en utilisant le mouvement dw et vertical.

Exemple de cette technique démontré ci-dessous:

Exemple

Je ne me trouve pas obligé d’aligner les choses assez souvent pour installer un autre plugin, donc c’était ma façon préférée d’y parvenir – surtout que cela ne nécessite pas beaucoup de reflection.

Comme le suggère sunny256, la commande column est un excellent moyen de le faire sur les machines Unix / Linux, mais si vous voulez le faire dans Vim pur (pour pouvoir l’utiliser également dans Windows), le plus simple est d’installer le Aligner le plugin et ensuite faire:

 :%Align , :%s/\(\s\+\),\s/,\1/g 

La première ligne aligne les entrées sur les virgules et la seconde déplace la virgule pour qu’elle soit alignée sur la valeur précédente. Vous pouvez peut-être utiliser AlignCtrl pour définir un mappage personnalisé qui fait tout en une fois, mais je ne me souviens plus comment l’utiliser …

modifier

Si cela ne vous dérange pas deux espaces entre les entrées et que vous voulez le faire en une seule commande, vous pouvez également faire:

 :%Align ,\zs 

C’est une excellente réponse en utilisant les macros vim: https://stackoverflow.com/a/8363786/59384 – en gros, vous commencez à enregistrer une macro, formatez la première colonne, arrêtez l’enregistrement puis répétez la macro pour toutes les lignes restantes.

Copié / collé à partir de cette réponse:

 qa0f:w100i 19|dwjq4@a 

Notez l’espace après le 100i, et les moyens “appuyez sur échapper” – ne tapez pas “” littéralement.

Traduction:

 qa -- record macro in hotkey a 0 -- go to beginning of line f: -- go to first : symbol w -- go to next non-space character after the symbol 100i  -- insert 100 spaces 19| -- go to 19th column (value 19 figured out manually) dw -- delete spaces until : symbol j -- go to next line q -- stop recording macro 4@a -- run the macro 4 times (for the remaining 4 lines) 

également si vous avez de très longues colonnes, il peut être pratique de désactiver l’emballage par défaut

 : définir maintenant
 :%! column -t

(note dans debian vous avez aussi une autre option pour la colonne -n ​​si vous voulez diviser plusieurs délimiteurs adjacents)

Vous pouvez utiliser le plug- in csv.vim .

 :%ArrangeColumn 

Cependant, cela ne correspond pas exactement à ce que vous avez demandé: vous pouvez ajuster le contenu des cellules, alors que vos valeurs sont alignées par le point décimal ou par le premier chiffre.

Le plugin a beaucoup d’autres commandes utiles pour travailler avec des fichiers CSV.

Nous avons maintenant aussi le fabuleux plugin EasyAlign , écrit par junegunn.

GIF de démonstration de son README:

Assez vieille question, mais je me suis récemment servi d’un excellent plugin vim qui permet le formatage des tables à la volée ou après coup (comme votre cas d’utilisation l’exige):

https://github.com/dhruvasagar/vim-table-mode

Je viens d’écrire un tableau à cet effet. Installer avec

 [sudo -H] pip3 install tablign 

Ensuite, marquez simplement la table dans vim et faites

 :'< ,'>:!tablign 

entrer la description de l'image ici

J’ai écrit un script python qui permet aux utilisateurs de regrouper de manière simple tout type de texte, même en dehors de vim. Vous ne savez pas si cela fonctionnera pour les utilisateurs Windows ou Mac.

columnice.py l’essentiel

Utilisation en vim.

 :'< ,'>!columnice = 

Cela utilisera le signe égal comme délimiteur. Le séparateur n’est pas jeté si.