Question

J'ai cet ensemble de données 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 constater, les nombres sont formatés différemment et mal alignés. Existe-t-il un moyen dans vim d’aligner rapidement les colonnes correctement, de sorte que le résultat soit 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?

Était-ce utile?

La solution

Si vous utilisez UNIX (Linux, etc.), vous pouvez tricher et le filtrer au moyen de la commande column (1).

:%!column -t

Ce qui précède analysera les délimiteurs dans les chaînes de caractères ce qui est incorrect. Vous aurez donc probablement besoin d'une étape de pré-traitement et de la spécification du délimiteur pour ce fichier, par exemple:

%!sed 's/","/\&/' | column -t -s '&'

Autres conseils

Parfois, nous souhaitons n’aligner que deux colonnes. Dans ce cas, nous n’avons besoin d’aucun plugin et pouvons utiliser les fonctionnalités Vim pures de la manière suivante:

  1. Choisissez un séparateur. Dans le message de OP, il s'agit d'une virgule, dans mon exemple, il s'agit de =.
  2. Ajouter des espaces avant / après. J'utilise s/=/= ...spaces... / dans la sélection visuelle pour cela.
  3. Recherchez le mot le plus long et placez le curseur après celui-ci.
  4. Supprimez tous les espaces supplémentaires à l'aide de dw mouvements verticaux.

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

Exemple

Je ne me trouve pas obligé d'aligner suffisamment souvent les choses pour installer un autre plugin, c'est donc la méthode que je privilégie pour l'accomplir, surtout que cela ne nécessite pas beaucoup de réflexion.

Comme Sunny256 l’a suggéré, la commande column est un excellent moyen de le faire sur les machines Unix / Linux, mais si vous voulez le faire en pur Vim (pour qu’il puisse également être utilisé sous Windows), le plus simple Pour cela, vous devez installer le plug-in Align , puis procédez comme suit:

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

La première ligne aligne les entrées sur les virgules et la seconde déplace la virgule de manière à ce qu'elle corresponde à la valeur précédente. Vous pourrez peut-être utiliser AlignCtrl pour définir un mappage personnalisé qui fasse tout d'un coup, mais je ne me souviens jamais comment l'utiliser ...

Modifier

Si vous ne vous occupez pas de deux espaces entre les entrées et que vous voulez le faire en une seule commande, vous pouvez aussi faire:

:%Align ,\zs

C’est une bonne réponse à l’aide des 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.

Copier / coller de cette réponse:

qa0f:w100i <Esc>19|dwjq4@a

Notez l'espace unique après le 100i et le < Esc > signifie & "; appuyez sur Échap &"; - ne tapez pas & "; < Échap > &"; 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 <Esc> -- 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)

Vous pouvez utiliser le plug-in csv.vim .

:%ArrangeColumn

Toutefois, cela ne fera pas exactement ce que vous avez demandé: cela ajustera correctement le contenu des cellules, alors que vos valeurs seront alignées sur le point décimal ou sur le premier chiffre.

Le plug-in contient de nombreuses autres commandes utiles pour travailler avec des fichiers CSV.

Nous disposons également du fabuleux plug-in EasyAlign , écrit par junegunn.

GIF de démonstration de son fichier README:

aussi si vous avez de très longues colonnes, il peut être pratique de désactiver le retour à la ligne par défaut

:set nowrap
:%!column -t

(note dans debian, vous avez également une autre option pour la colonne -n, qui vous permet de scinder plusieurs délimiteurs adjacents.)

C'est une vieille question, mais je me suis récemment doté d'un excellent plug-in vim qui permet de formater les tableaux à la volée ou après-coup (selon les besoins de votre cas d'utilisation):

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

Je viens d'écrire tablign à cette fin. Installer avec

[sudo -H] pip3 install tablign

Marquez simplement la table dans vim et faites-le

:'<,'>:!tablign

 entrer la description de l'image ici

J'ai écrit un script python qui permet aux utilisateurs de rassembler simplement tout type de texte, y compris en dehors de vim. Vous ne savez pas si cela fonctionnera pour les utilisateurs de Windows ou de Mac.

columnice.py gist

Utilisation dans vim.

:'<,'>!columnice =

Ceci utilisera le signe égal comme séparateur. Le délimètre n'est toutefois pas jeté.

Voici & # 8217; une réponse de script Vim pure, pas de plug-ins, pas de macros:

Il serait peut-être plus évident de commencer par la solution de mon problème & # 8217; à titre d'exemple. J'ai sélectionné les lignes de code que je voulais affecter, puis utilisé la commande suivante (rappelez-vous que l'entrée en mode commande à partir du mode visuel ajoute automatiquement le & # 8220; '& L;;'! '!! # 8221 ;, il agit donc sur la plage visuelle):

:'<,'>g``normal / "value<0d>D70|P`

Sauf que je n'ai PAS réellement tapé & # 8220; < 0d > & # 8221 ;. Vous pouvez entrer des caractères non imprimables sur la ligne de commande en appuyant sur ctrl-v, puis sur la touche à saisir. & # 8220; & Lt; 0d & Gt; & # 8221; est ce qui est rendu sur la ligne de commande après avoir tapé & # 8216; ctrl-v entrez & # 8217 ;. Ici, il & # 8217; est analysé par le & # 8220; normal & # 8221; commande comme sortie de & # 8220; / & # 8221; mode de recherche. Le curseur passe ensuite à & # 8220; valeur & # 8221; dans la ligne en cours.

Ensuite, nous supprimons simplement le reste de la ligne, passons à la colonne 70 (ou ce dont vous avez besoin dans votre cas), et supprimez ce que nous venons de supprimer. Cela signifie que nous devons déterminer la largeur de la ligne la plus large, jusqu’à notre recherche. Si vous n'avez pas & # 8217; t mis cette information dans votre statut, vous pouvez voir la colonne du curseur en entrant la commande de mode normal & # 8216; g ctrl-g & # 8217 ;. Notez également que le passage à une colonne qui n'existe pas! & # 8217; t nécessite le paramètre "virtualedit"!

J'ai laissé le terme de recherche de la commande: g (lobal) vide, car nous utilisions un bloc visuel et voulions affecter chaque ligne, mais vous pouvez le faire en utilisant une sélection visuelle (et la & # 8220; ' < ;, '> & # 8221;) et placez-y un terme de recherche. Vous pouvez également combiner une sélection visuelle et un terme de recherche pour affiner / finement les choses.

Voici & # 8217; c’est quelque chose que j’ai appris récemment: si vous vous trompez avec une commande en mode commande complexe, annulez-le avec & # 8216; u & # 8217; (si cela a affecté le tampon), appuyez sur & # 8220; q: & # 8221; pour entrer dans un tampon spécial d’historique des commandes qui ressemble beaucoup à un tampon conventionnel. Modifiez une ligne et appuyez sur Entrée. La commande modifiée est entrée en tant que nouvelle commande. Indispensable si vous & # 8217; ne voulez pas vous inquiéter de tout formuler à la perfection dès la première fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top