Saya menuliskan tabel penurunan harga yang terlihat seperti ini:
| 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 |
Saya mencari cara untuk dengan cepat menghitung total kolom ketiga dan memasukkannya ke dalam buffer. Solusi yang ada dalam pikiran saya akan menggunakan mode blok visual (untuk memilih semua angka) dan mungkin dari daftar ekspresi (untuk melakukan matematika).
Apakah ini mungkin menggunakan perintah Vim asli? Jika tidak, apakah ada plugin yang dapat membantu saya?
visual-mode
arithmetic
zool
sumber
sumber
Jawaban:
Saya menulis sebuah plugin: https://github.com/sk1418/HowMuch yang mendukung pemilihan visual dan melakukan perhitungan matematika.
Secara default plugin mendukung tiga mesin evaluasi ekspresi matematika: Gnu bc, python, dan vimscript. Anda dapat melakukan perhitungan pada yang tertentu atau membiarkan plugin secara otomatis memilih satu untuk Anda.
Ini berfungsi dengan contoh Anda seperti ini:
Untuk detailnya, baca README di github.
sumber
For details please read the README on github.
Bahkan jika saya meletakkan penekanan tombol yang saya tekan untuk masalah ini di sini, saya tidak melihat seberapa membantu itu bisa terjadi, itu hanya 3 atau 4 kombinasi tombol. Jika skrip saya benar-benar dibutuhkan oleh seseorang, dia akan tetap memeriksa detailnya.Jika Anda tidak ingin menggunakan plugin atau drop ke skrip bash, Anda dapat melakukan sesuatu seperti berikut:
c-V {motions} "ay
salin kolom ke"a
:let @a = substitute(@a, 'c-V c-J', '+', 'g')
ganti baris baris baru dengan+
ic-R=c-Ra
jalankan yang diganti"a
melalui register ekspresiAtau: buat entri riwayat ekspresi dapat digunakan kembali untuk jumlah kolom selanjutnya
ctrl-V {motions} y
masukkan kolom ke daftar yank""
ictrl-R=eval(substitute(@", '\n', '+', 'g'))
Mengulangi untuk kolom lain:
ctrl-V {motion} y
(tidak berubah)ictrl-R=<CR>
atau jika Anda melakukan sesuatu yang lain dengan register ekspresi, siklus sejarah dengan tombol panah atas (atau denganctrl-P
jika Anda memetakannya kembali):ictrl-R=<up>...<up><CR>
sumber
"
bukan tanda kutip tunggal'
padasubstitute
perintah. Apakah Anda tahu apakah ada alasan untuk itu?Penjelasan:
Saya telah mencoba fungsi yang berfungsi di sini:
Menggunakan peta di atas termasuk, yang harus Anda lakukan setelah memuat dalam fungsi ini adalah memilih angka yang ingin Anda jumlahkan dan gunakan
<leader>s
untuk menjumlahkan area yang dipilih.Penjelasan fungsi:
Ini menggunakan
try/finally/endtry
ekstruktur untuk menangkap kesalahan.Jika Anda ingin mencoba fungsi ini, lakukan hal berikut: Salin fungsi ini di browser Anda dan jalankan perintah ini pada vim
:@+
ini akan memungkinkan Anda untuk menggunakan secara:call SumVis()
normal.Perlu Anda membuat pilihan blok visual dengan ctrl+ v, batalkan pilihan dan akhirnya memanggil fungsi. Atau Anda dapat menggunakan peta yang disarankan yang dengan sendirinya menghapus pilihan sebelum menghitung.
sumber
Plugin csv saya memungkinkan ini. Gunakan
:SumCol
perintah dan pastikan untuk membaca dokumentasi.sumber
Membuat plugin atau coding ini dalam vimscript agak berat. Saya percaya pada vim bebas plugin, dan komposisi yang baik dengan alat eksternal.
Ini adalah perintah 1 kali, berdasarkan pada user2571881, yang berfungsi bahkan jika buffer belum disimpan.
Jika Anda ingin menyimpan perintah ini untuk penggunaan di masa mendatang, Anda mungkin ingin memberi nama:
Ini bekerja dengan pemilihan visual. Jika Anda memilih beberapa baris dan masuk ke mode perintah, vim akan mengawali perintah Anda dengan
:'<,'>
, yang merupakan rentang garis untuk pemilihan visual. Jadi Anda dapat menjalankan:dan itu hanya akan menjumlahkan kolom ke-3 dari baris yang dipilih. Secara default kisarannya adalah
%
, jadiakan menjumlahkan kolom ke-3 dari semua baris.
EDIT: Jika Anda ingin dapat menentukan pemisah bidang lainnya dan default kolom dihitung ke yang terakhir, Anda dapat menutup perintah di
bash
dan menangani argumen dengan itu, seperti ini:Sekarang,
akan menghitung kolom terakhir dari tabel dengan "|" pemisah lapangan,
akan menghitung kolom ke-3 tabel dengan "|" pemisah bidang, dan
akan menghitung kolom ke-3 tabel dengan pemisah bidang "+".
sumber
SumColumn
ke vimrc berarti Anda cukup memiliki 'plugins' di vimrc Anda. Semoga Anda pandai mempertahankan ini seiring waktu. Bagi saya plugin menyediakan dokumentasi, pemisahan menjadi bagian-bagian yang bermakna, memanfaatkan kecerdikan orang lain. Saya berkontribusi pada upstream yang meningkatkan plugin luar biasa yang tidak ada yang punya waktu untuk membuat semuanya sendiri (kecuali tpope). Apakah Anda tidak menggunakan vim-surround, vim-fugitive, vim-easy-align / vim-lion, vim-unimpaired, vim-commentary, ultisnips atau ft-specific yang seperti vim-go, vim-rails, vimtex?Jika kolom disejajarkan dengan benar, ini dapat dilakukan dengan oneliner sederhana.
CTRL-V
+ memindahkan kursory
:echo eval(join(split(@", '\_s\+'), '+'))
yang membagi teks yang ditarik ke spasi dan baris baru, bergabung kembali dengan elemen+
karakter, dan mengevaluasi string.+
dan mengevaluasi::echo eval(substitute(@", "\n", '+', 'g'))
-eval()
adalah hal terdekat yangreduce
kita miliki.Jika tidak, Anda harus menggunakan trik lain untuk menghitung bidang. Misalnya,
split(getline('.'), "[ \t|]\\+")
dapat digunakan untuk memisahkan kolom dari satu baris dalam array Anda. Dari sana, menjadi sesederhana::echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))
Untuk menghilangkan nilai magis (bidang nomor - 1, dan
+
), ini bisa menjadi perintahYang dapat digunakan dengan:
Catatan: Di sini saya menggunakan lambdas dari Vim 7.4.1xxx
sumber
vmap
++
dari pluginvmath
oleh Damian ConwayInstal plugin dari github (hanya 178 sloc) misalnya
Tambahkan pemetaan ke vimrc Anda
Namun, saya akan menyarankan untuk menggunakan sesuatu yang lain, misalnya
gA
2f|
dan pilih kolom dalam mode blok visual<C-V>G$
++
(atau pemetaan yang Anda pilih)s
)s
, misalnya dengan"sp
Untuk presentasi plugin ini, lihat video YouTube Damian Conway, "More Instantly Better Vim" - OSCON 2013 (mulai dari menit 29).
sumber
Alat cli eksternal
csvstat
dari csvkitPenjelasan singkat tentang opsi
-d DELIMITER
Membatasi karakter file CSV input. Di sini|
.-H
Tentukan bahwa file CSV input tidak memiliki baris header.-c COLUMNS
Daftar indeks atau nama kolom yang dipisahkan koma untuk diperiksa. Default untuk semua kolom.--sum
Hanya jumlah output.Alat ini juga menyediakan min, maks, rata-rata, median, stdev (standar deviasi), menghitung nilai unik, daftar nilai sering.
Masukkan ke dalam file dengan
Instalasi
Pada macOS csvkit tersedia melalui homebrew dan pada Debian / Ubuntu dan sejenisnya dapat diinstal dengan
$ sudo apt install csvkit
.sumber