J'écris une table de démarque qui ressemble à ceci:
| 13/05/15 | 09:30-16:00 | 6.5 |
| 14/05/15 | 10:00-16:30 | 6.5 |
| 16/05/15 | 15:30-01:00 | 9.5 |
| 21/05/15 | 09:00-16:30 | 7.5 |
| 22/05/15 | 08:30-17:00 | 8.5 |
| 28/05/15 | 09:30-15:30 | 6 |
| 02/06/15 | 09:00-20:00 | 11 |
| 03/06/15 | 08:30-22:30 | 14 |
Je cherche un moyen de calculer rapidement le total de la troisième colonne et de l'insérer dans le tampon. La solution que j'ai en tête consisterait à utiliser le mode bloc visuel (pour sélectionner tous les nombres) et peut-être le registre d'expression (pour faire le calcul).
Serait-ce possible en utilisant les commandes natives de Vim? Sinon, existe-t-il un plugin qui peut m'aider?
Réponses:
J'ai écrit un plugin: https://github.com/sk1418/HowMuch qui prend en charge la sélection visuelle et effectue des calculs mathématiques.
Par défaut, le plugin prend en charge trois moteurs d'évaluation d'expressions mathématiques: Gnu bc, python et vimscript. Vous pouvez faire les calculs sur un certain ou laisser le plugin en choisir automatiquement un pour vous.
Cela fonctionne avec votre exemple comme ceci:
Pour plus de détails, veuillez lire le fichier README sur github.
la source
For details please read the README on github.
Même si je mets ici les touches sur lesquelles j'ai appuyé pour ce problème, je ne vois pas à quel point cela pourrait être utile, il ne s'agit que de 3 ou 4 combinaisons de touches. Si mon script est vraiment nécessaire à quelqu'un, il vérifiera quand même les détails.Si vous ne voulez pas utiliser de plugins ou passer à un script bash, vous pouvez faire quelque chose comme ceci:
c-V {motions} "ay
copier la colonne dans"a
:let @a = substitute(@a, 'c-V c-J', '+', 'g')
remplacer les nouvelles lignes de colonne par+
ic-R=c-Ra
exécuter le remplacé"a
via le registre d'expressionAlternativement: rendre l'entrée de l'historique des expressions réutilisable pour d'autres sommes de colonnes
ctrl-V {motions} y
mettre la colonne dans le registre yank""
ictrl-R=eval(substitute(@", '\n', '+', 'g'))
Répétition pour une autre colonne:
ctrl-V {motion} y
(inchangé)ictrl-R=<CR>
ou si vous avez fait autre chose avec le registre d'expressions, parcourez l'historique avec la touche fléchée vers le haut (ou avecctrl-P
si vous l'avez remappé):ictrl-R=<up>...<up><CR>
la source
"
au lieu de guillemets simples'
sur lasubstitute
commande. Savez-vous s'il y a une raison à cela?Explication:
J'ai essayé une fonction qui fonctionne ici:
En utilisant la carte ci-dessus incluse, tout ce que vous avez à faire après le chargement dans la fonction est de sélectionner les nombres que vous souhaitez additionner et utiliser
<leader>s
pour additionner la zone sélectionnée.Explication de la fonction:
Il utilise l'
try/finally/endtry
extructure pour capturer les erreurs.Si vous voulez essayer cette fonction, procédez comme suit: Copiez cette fonction dans votre navigateur et exécutez cette commande sur vim
:@+
cela vous permettra de l'utiliser:call SumVis()
normalement.Il vous faut faire une sélection de bloc visuelle avec ctrl+ v, désélectionner et enfin appeler la fonction. Ou vous pouvez utiliser la carte suggérée qui supprime d'elle-même la sélection avant le calcul.
la source
Mon plugin csv le permet. Utilisez la
:SumCol
commande et assurez-vous de lire la documentation.la source
Faire un plugin ou le coder en vimscript semble un peu lourd. Je crois en un vim sans plugin et une bonne composition avec des outils externes.
Voici une commande unique, basée sur celle de user2571881, qui fonctionne même si le tampon n'a pas été enregistré.
Si vous souhaitez enregistrer cette commande pour une utilisation future, vous pouvez la nommer:
Cela fonctionne avec la sélection visuelle. Si vous sélectionnez quelques lignes et passez en mode commande, vim préfixera votre commande
:'<,'>
, qui est la plage de lignes pour la sélection visuelle. Vous pouvez donc exécuter:et il additionnera seulement la 3ème colonne des lignes sélectionnées. Par défaut, la plage est
%
, doncadditionnera la 3ème colonne de toutes les lignes.
EDIT: Si vous souhaitez pouvoir spécifier d'autres séparateurs de champs et par défaut la colonne comptée jusqu'à la dernière, vous pouvez couvrir la commande
bash
et gérer les arguments avec, comme ceci:Maintenant,
comptera la dernière colonne d'une table avec "|" séparateurs de champ,
comptera la 3ème colonne d'un tableau avec "|" séparateurs de champ, et
comptera la 3ème colonne d'un tableau avec des séparateurs de champ "+".
la source
SumColumn
vimrc signifie que vous avez simplement vos «plugins» dans votre vimrc. J'espère que vous réussissez à maintenir cela avec le temps. Pour moi, les plugins fournissent la documentation, la séparation en parties significatives, tirant parti de l'ingéniosité des autres. Je contribue à l'amont qui améliore des plugins incroyables que personne n'a le temps de créer tous par eux-mêmes (sauf tpope). N'utilisez-vous pas vim-surround, vim-fugitive, vim-easy-align / vim-lion, vim-unimpaired, vim-commentary, ultisnips ou spécifiques à ft tels que vim-go, vim-rails, vimtex?Si les colonnes sont correctement alignées, cela peut être fait avec un simple oneliner.
CTRL-V
+ déplacez le curseury
:echo eval(join(split(@", '\_s\+'), '+'))
qui fractionne le texte tiré sur les espaces et les nouvelles lignes, rejoint l'élément avec du+
caractère et évalue la chaîne.+
et évaluer::echo eval(substitute(@", "\n", '+', 'g'))
-eval()
est la chose la plus proche dereduce
nous.Sinon, vous devrez utiliser d'autres astuces pour compter les champs. Par exemple,
split(getline('.'), "[ \t|]\\+")
peut être utilisé pour diviser les colonnes d'une ligne de votre tableau. À partir de là, cela devient aussi simple que::echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))
Afin de se débarrasser des valeurs magiques (numéro de champ - 1, et
+
), cela peut devenir une commandeQui peut être utilisé avec:
Remarque: ici, j'utilise des lambdas de Vim 7.4.1xxx
la source
vmap
++
du pluginvmath
par Damian ConwayInstaller le plugin depuis github (seulement 178 sloc) par exemple
Ajoutez un mappage à votre vimrc
Cependant, je suggérerais d'utiliser autre chose, par exemple
gA
2f|
et sélectionnez la colonne en mode bloc visuel<C-V>G$
++
(ou sur la cartographie choisie)s
)s
, par exemple avec"sp
Pour une présentation de ce plugin, voir la vidéo YouTube Damian Conway, "More Instantly Better Vim" - OSCON 2013 (à partir de la minute 29).
la source
Outil cli externe
csvstat
de csvkitBrève explication des options
-d DELIMITER
Délimitation du caractère du fichier CSV d'entrée. Ici|
.-H
Spécifiez que le fichier CSV d'entrée n'a pas de ligne d'en-tête.-c COLUMNS
Une liste séparée par des virgules d'indices ou de noms de colonnes à examiner. Par défaut à toutes les colonnes.--sum
Uniquement les sommes de sortie.Cet outil fournit également les valeurs min, max, moyenne, médiane, stdev (écart-type), le nombre de valeurs uniques, la liste des valeurs fréquentes.
Insérer dans le fichier avec
Installation
Sur macOS csvkit est disponible via homebrew et sur Debian / Ubuntu et similaire, il peut être installé avec
$ sudo apt install csvkit
.la source