format ulang dalam vim untuk tata letak kolom yang bagus

126

Saya memiliki dataset ini dalam file 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

Seperti yang Anda lihat, angka-angka diformat secara berbeda dan tidak selaras. Apakah ada cara di vim untuk cepat menyelaraskan kolom dengan benar, sehingga hasilnya adalah ini

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

Itu bagus untuk menyalin dan menempel bagian dengan ctrl-v. Ada petunjuk?

Stefano Borini
sumber

Jawaban:

263

Jika Anda menggunakan beberapa jenis UNIX (Linux, dll), Anda dapat menipu dan memfilternya melalui perintah kolom (1).

:%!column -t

Di atas akan menguraikan pembatas di dalam string literal yang salah, sehingga Anda mungkin perlu langkah-langkah pra-pemrosesan dan menentukan pembatas untuk file ini misalnya:

%!sed 's/","/\&/' | column -t -s '&'
sunny256
sumber
1
Perintah keren, saya tidak menyadarinya (telah menulis skrip perl kustom untuk melakukan operasi semacam itu di masa lalu).
hlovdal
24
Karena file saya tidak memiliki ruang yang harus saya gunakan :%!column -t -s ','. Ini menghapus koma, jadi mereka bukan file csv teknis lagi. Tetapi mengatur mereka dengan indah, itulah yang saya butuhkan.
Eduardo
27
Tip yang bagus! Hanya menambahkan, ini juga berfungsi untuk pemilihan visual dengan:'<,'>!column -t
freitas
2
Adakah yang tahu solusi untuk bekerja dengan kolom yang dikutip dengan koma di kolom? contoh "2151 Main ST Houston, TX"
metrix
3
@metrix, ini adalah solusi yang sangat kikuk: 1) mengubah spasi di dalam pembatas menjadi karakter yang berbeda, 2) kemudian jalankan columnseperti yang dijelaskan dalam posting, 3) kemudian ganti pembatas Anda kembali ke spasi. Contoh perintah dalam mode visual untuk langkah # 1 adalah:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Luciano
54

Terkadang kami ingin menyelaraskan hanya dua kolom. Dalam hal ini, kami tidak memerlukan plugin apa pun dan dapat menggunakan fungsionalitas Vim murni seperti ini:

  1. Pilih pemisah. Dalam pos OP ini koma, dalam contoh saya ini =.
  2. Tambahkan spasi sebelum / sesudahnya. Saya menggunakan s/=/= ...spaces... /dalam pemilihan visual untuk ini.
  3. Temukan kata dan tempatkan kursor terlama setelahnya.
  4. Hapus semua spasi putih menggunakan dwdan gerakan vertikal.

Contoh teknik ini ditunjukkan di bawah ini:

Contoh

Saya tidak menemukan diri saya perlu cukup sering menyelaraskan hal-hal untuk menginstal plugin lain, jadi ini adalah cara pilihan saya untuk mencapainya - terutama yang tidak memerlukan banyak pemikiran.

rr-
sumber
4
Bagaimana Anda membuat gif yang bagus itu?
Stefano Borini
1
blog.bahraniapps.com/gifcam sayangnya, sepertinya ini hanya alat Windows.
rr-
Ketika Anda selesai menyelaraskan bagian atas, bagaimana Anda memindahkan kursor ke tengah layar dan kemudian mulai menyelaraskan bagian bawah?
cychoi
5
Setelah :s/=/ =/itu jauh lebih baik digunakan Ctrl + Vuntuk memilih kolom kanan, lalu sejajarkan menggunakan <<dan .mengulangi. Ditemukan di sini: stackoverflow.com/a/24704379/2152384
pozitron57
1
Atau buat makro untuk melakukan pekerjaan de @ pozitron57
Arthur Julião
24

Seperti yang disarankan sunny256, columnperintah adalah cara terbaik untuk melakukan ini pada mesin Unix / Linux, tetapi jika Anda ingin melakukannya dalam Vim murni (sehingga dapat digunakan di Windows juga), cara termudah adalah menginstal Align plugin dan kemudian lakukan:

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

Baris pertama menyelaraskan entri pada koma dan yang kedua memindahkan koma sehingga rata dengan nilai sebelumnya. Anda mungkin dapat menggunakan AlignCtrluntuk menentukan pemetaan khusus yang melakukan banyak sekaligus, tetapi saya tidak pernah ingat bagaimana menggunakannya ...

Edit

Jika Anda tidak keberatan dua spasi di antara entri dan Anda ingin melakukan ini dalam satu perintah, Anda juga dapat melakukan:

:%Align ,\zs
DrAl
sumber
Berfungsi sempurna dalam Tabel LaTeX::'<,'>Align &
Thomas
Itu dapat dicapai juga dengan :%Align! lP0 \s( l= rata rata, P0= 0 padding setelah pemisah).
tgl
8

Ini adalah jawaban yang bagus menggunakan makro vim: https://stackoverflow.com/a/8363786/59384 - pada dasarnya, Anda mulai merekam makro, memformat kolom pertama, berhenti merekam lalu ulangi makro untuk semua baris yang tersisa.

Salin / tempel dari jawaban itu:

qa0f:w100i <Esc>19|dwjq4@a

Catat spasi tunggal setelah 100i, dan <Esc> berarti "tekan keluar" - jangan ketik "<Esc>" secara harfiah.

Terjemahan:

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)
zcrar70
sumber
7

Kami sekarang juga memiliki plugin EasyAlign yang luar biasa , ditulis oleh junegunn.

Demonstrasi GIF dari README-nya:

rr-
sumber
4

Anda bisa menggunakan plugin csv.vim .

:%ArrangeColumn

Namun, ini tidak akan melakukan persis apa yang Anda minta: itu akan benar menyesuaikan konten sel, sedangkan Anda memiliki nilai-nilai Anda selaras dengan titik desimal atau dengan digit pertama.

Plugin ini memiliki banyak perintah berguna lainnya untuk bekerja dengan file CSV.

Daan
sumber
3

juga jika Anda memiliki kolom yang sangat panjang, mungkin berguna untuk menonaktifkan pembungkus standar

: atur nowrap
:%! kolom -t

(catatan dalam debian Anda juga memiliki opsi lebih lanjut untuk kolom -n yang jika Anda ingin membagi beberapa pembatas yang berdekatan)

Amos Folarin
sumber
jauh lebih baik dengan nowrap. Saya sertakan saran Anda, terima kasih 'perintah CSV atur nowrap | %! kolom -t -s ',' `.
Peruz
juga, perhatikan opsi -n untuk menonaktifkan penggabungan kolom kosong. stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz
3

Saya baru saja menulis tablign untuk tujuan ini. Instal dengan

pip3 install tablign --user

Kemudian cukup tandai tabel dalam vim dan lakukan

:'<,'>:!tablign

masukkan deskripsi gambar di sini

Nico Schlömer
sumber
1

Pertanyaan yang cukup lama, tetapi saya baru-baru ini memanfaatkan plugin vim yang sangat baik yang memungkinkan pemformatan tabel dengan cepat atau setelah-fakta (seperti yang dibutuhkan oleh use case Anda):

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

Alice
sumber
1

Berikut jawaban skrip Vim murni, tidak ada plugin, tidak ada makro:

Mungkin paling jelas untuk memulai dengan solusi masalah saya sebagai contoh. Saya memilih baris kode yang ingin saya pengaruhi, kemudian menggunakan perintah berikut (ingat bahwa memasukkan mode perintah dari mode visual secara otomatis menambahkan "“ <, '> ", sehingga ia bertindak pada rentang visual):

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

Kecuali saya TIDAK benar-benar mengetik "<0d>". Anda dapat memasukkan karakter yang tidak dapat dicetak pada baris perintah dengan menekan ctrl-v, lalu tombol yang ingin Anda ketik. “<0d>” adalah apa yang diberikan pada baris perintah setelah saya mengetik 'ctrl-v enter'. Di sini, ini diuraikan oleh perintah "normal" sebagai keluar dari mode pencarian "/". Kursor kemudian melompat ke "nilai" di baris saat ini.

Kemudian kita cukup [D] menghapus sisa baris, melompat ke kolom 70 (atau apa pun yang Anda butuhkan dalam kasus Anda), dan [P] ut apa yang baru saja kami hapus. Ini berarti kita harus menentukan lebar garis terluas, hingga pencarian kita. Jika Anda belum memasukkan informasi itu di baris status Anda, Anda dapat melihat kolom kursor dengan memasukkan perintah mode normal 'g ctrl-g'. Perhatikan juga bahwa melompat ke kolom yang tidak ada memerlukan pengaturan 'virtualedit'!

Saya membiarkan istilah pencarian untuk perintah: g (lobal) kosong, karena kami menggunakan blok visual dan ingin memengaruhi setiap baris, tetapi Anda dapat berhenti menggunakan pemilihan visual (dan "'<,'>") dan meletakkan istilah pencarian di sana sebagai gantinya. Atau kombinasikan pilihan visual dan istilah pencarian untuk mempersempit sesuatu dengan lebih halus / mudah.

Inilah sesuatu yang saya pelajari baru-baru ini: jika Anda mengacaukan perintah mode perintah kompleks, batalkan dengan 'u' (jika itu mempengaruhi buffer), lalu tekan "q:" untuk memasukkan buffer sejarah perintah khusus yang bertindak seperti buffer konvensional . Edit baris apa saja dan tekan enter, dan perintah yang diubah dimasukkan sebagai perintah baru. Sangat diperlukan jika Anda tidak ingin stres saat memformulasikan semuanya dengan sempurna pertama kali.

atimholt
sumber
0

Saya menulis skrip python yang memungkinkan pengguna untuk melakukan kolumisasi pada semua jenis teks juga di luar vim. Tidak yakin apakah ini akan berfungsi untuk pengguna windows atau mac.

intinya columnice.py

Penggunaan saat dalam vim.

:'<,'>!columnice =

Ini akan menggunakan tanda sama dengan sebagai delimeter. Delimeter tidak dibuang begitu saja.

Bassim Huis
sumber
0

Saya memiliki ini di .vimrc saya.

command! CSV set nowrap | %s/,/,|/g | %!column -n -t -s "|" 

Ini meluruskan kolom sambil menjaga koma, yang mungkin diperlukan nanti untuk pembacaan yang benar. Misalnya, dengan Python Pandas read_csv(..., skipinitialspace=True), terima kasih Pandas guys untuk opsi cerdas ini, jika tidak dalam vim %s/,\s\+/,/g. Mungkin lebih mudah jika Anda columnmemiliki opsi --output-separator. Saya kira, saya tidak dan saya tidak yakin mengapa (halaman manual saya untuk kolom mengatakan 2004, di ubuntu 18.04, tidak yakin ubuntu akan mendapatkan versi baru) . Bagaimanapun, ini bekerja untuk saya, dan berkomentar jika Anda punya saran.

Peruz
sumber