переформатувати в vim для отримання гарного макета стовпця


126

У мене цей набір даних у файлі 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

Як бачимо, номери відформатовані по-різному та несогласовані. Чи є спосіб vim швидко вирівняти стовпчики належним чином, щоб результат був таким

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

Це було б чудово, щоб скопіювати та вставити розділи за допомогою ctrl-v. Якісь підказки?

Відповіді:


263

Якщо ви знаходитесь на якомусь UNIX (Linux тощо), ви можете обдурити і відфільтрувати його за допомогою команди стовпця (1).

:%!column -t

Вищенаведене буде розбирати роздільники всередині рядкових літералів, що неправильно, тому, ймовірно, вам знадобляться етапи попередньої обробки та вказівник роздільника для цього файлу, наприклад:

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

1
Класна команда, я про це не знав (написав користувальницький сценарій perl для виконання такої операції в минулому).
hlovdal

24
Оскільки у моїх файлах не було місця, яке мені довелося використовувати :%!column -t -s ','. Це видаляє коми, тому вони вже не є технічними CSV-файлами. Але влаштовує їх красиво, це те, що мені було потрібно.
Едуардо

27
Чудова порада! Тільки додавши, він також працює для візуального відбору:'<,'>!column -t
freitass

2
Хтось знає про рішення роботи з цитованими колонками з комами в стовпці? приклад "2151 Main ST Houston, TX"
метрика

3
@metrix, ось дуже незграбний спосіб вирішення: 1) перетворити пробіли всередині розділювачів у інший символ; 2) потім запустити, columnяк описано в публікації; 3) потім замінити роздільники назад до пробілів. Приклад команди у візуальному режимі для кроку №1:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Лучано,

54

Іноді ми хочемо вирівняти лише два стовпчики. У такому випадку нам не потрібні додаткові плагіни, і ми можемо використовувати чистий функціонал Vim, подібний до цього:

  1. Виберіть роздільник. На посаді ОП це кома, в моєму прикладі це =.
  2. Додайте пробіли до / після нього. Я використовую s/=/= ...spaces... /для цього візуальний відбір.
  3. Знайдіть найдовше слово та поставте курсор після нього.
  4. Видаліть усі зайві пробіли за допомогою dwвертикального руху.

Приклад цієї методики показаний нижче:

Приклад

Мені не здається, що потрібно вирівнювати речі досить часто, щоб встановити інший плагін, тому це був мій вподобаний спосіб його виконання - тим більше, що він не потребує багато роздумів.


4
Як ти зробив цей приємний gif?
Стефано Борині

1
blog.bahraniapps.com/gifcam, на жаль, схоже, що це лише інструмент для Windows.
rr-

Коли ви закінчили вирівнювання верхньої частини, як ви перемістили курсор на середину екрана, а потім почали вирівнювати нижню частину?
cychoi

5
Після :s/=/ =/цього набагато краще використовувати Ctrl + Vправильний стовпець, а потім вирівняти його за допомогою <<та .повторити. Знайдено тут: stackoverflow.com/a/24704379/2152384
pozitron57

1
Або створіть макрос, щоб виконувати роботу @ pozitron57
Артур Джуліано,

24

Як запропонував sunny256, columnкоманда - це чудовий спосіб зробити це на машинах Unix / Linux, але якщо ви хочете зробити це в чистому Vim (щоб його можна було використовувати і в Windows), найпростіший спосіб - встановити вирівняти. плагін, а потім виконайте:

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

Перший рядок вирівнює записи на комах, а другий переміщує кому так, щоб вона була врівень з попереднім значенням. Можливо, ви зможете AlignCtrlвизначити спеціальне відображення, яке робить цілу партію за один раз, але я ніколи не пам'ятаю, як її використовувати ...

Редагувати

Якщо ви не заперечуєте проти двох проміжків між записами і хочете зробити це в одній команді, ви також можете зробити:

:%Align ,\zs

Чудово працює в таблиці LaTeX::'<,'>Align &
Томас

Це також можна виконати за допомогою :%Align! lP0 \s( l= вирівняний ліворуч, P0= 0 прокладки після роздільника).
ntd

8

Це чудова відповідь за допомогою макросів vim: https://stackoverflow.com/a/8363786/59384 - в основному ви починаєте запис макросу, форматуєте перший стовпець, припиняєте запис, а потім повторюєте макрос для всіх решти рядків.

Скопіюйте / вставте з цього відповідь:

qa0f:w100i <Esc>19|dwjq4@a

Зверніть увагу на один пробіл після 100i, а <Esc> означає "натиснути втечу" - не вводьте "<Esc>" буквально.

Переклад:

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)


7

Зараз у нас також є казковий плагін EasyAlign , написаний junegunn.

Демонстраційний GIF з програми "README":


4

Ви можете використовувати плагін csv.vim .

:%ArrangeColumn

Однак це не виконає саме те, про що ви просили: він буде правильно коригувати вміст комірок, тоді як у вас значення вирівнюються за десятковою або першою цифрою.

У плагіна є багато інших корисних команд для роботи з файлами CSV.


3

також якщо у вас дуже довгі стовпці, це може бути зручно відключити обгортку за замовчуванням

: встановити nowrap
:%! стовпець -t

(зверніть увагу на debian, ви також маєте додатковий варіант для стовпця -n, який, якщо ви хочете розділити кілька сусідніх роздільників)


набагато краще з норапом. Я включив вашу пропозицію, спасибі 'команда CSV встановити nowrap | %! стовпець -t -s ',' `.
Перуз

також зверніть увагу на опцію -n, щоб відключити об'єднання порожніх стовпців. stackoverflow.com/questions/1875305/command-line-csv-viewer
Перуз

3

Я щойно для цієї мети написав табличку . Встановити за допомогою

pip3 install tablign --user

Потім просто позначте таблицю vim і зробіть

:'<,'>:!tablign

введіть тут опис зображення


1

Досить старе запитання, але нещодавно я скористався чудовим плагіном vim, який дозволяє форматувати таблицю як на ходу, так і після факту (як вимагає ваш випадок використання):

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


1

Ось чистий відповідь сценарію Vim, без плагінів, без макросів:

Можливо, найяскравіше почати з вирішення моєї проблеми як прикладу. Я вибрав рядки коду, на які хотів вплинути, і застосував таку команду (нагадаємо, що введення командного режиму з візуального режиму автоматично передує "" <, '> ", тому він діє на зоровий діапазон):

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

За винятком того, що я НЕ насправді набрав "<0d>". Ви можете ввести недруковані символи в командному рядку, натиснувши ctrl-v, потім клавішу, яку потрібно ввести. "<0d>" - це те, що відображається в командному рядку після того, як я набрав "ctrl-v enter". Тут вона розбирається командою "нормальний" як вихід з режиму пошуку "/". Потім курсор стрибає до "значення" в поточному рядку.

Тоді ми просто [D] підбираємо решту рядка, переходимо до стовпця 70 (або все, що вам потрібно у вашому випадку), і [P] вимовляємо те, що ми тільки що видалили. Це означає, що ми маємо визначити ширину найширшої лінії, до нашого пошуку. Якщо ви не вказали цю інформацію у своєму статусному рядку, ви можете побачити стовпчик курсора, ввівши команду звичайного режиму 'g ctrl-g'. Також зауважте, що для переходу до стовпця, який не існує, потрібне налаштування "virtualedit"!

Я залишив пошуковий термін для команди: g (lobal) порожнім, оскільки ми використовували візуальний блок і хотіли вплинути на кожен рядок, але ви можете відмовитися від використання візуального вибору (і "'<,'>") і поставити пошуковий термін замість цього. Або поєднайте візуальний вибір та пошуковий термін, щоб більш тонко / легко звузити речі.

Ось, про що я нещодавно дізнався: якщо ви зіпсуєте складну команду командного режиму, скасуйте "u" (якщо це вплинуло на буфер), а потім натисніть "q:", щоб увійти до спеціального буфера історії команд, який діє так, як звичайний буфер . Відредагуйте будь-який рядок і натисніть клавішу Enter, а змінена команда буде введена як нова команда. Незамінне, якщо ви не хочете, щоб підкреслити, щоб сформулювати все ідеально з першого разу.


0

Я написав сценарій python, який дозволяє користувачам в основному збирати текст будь-якого типу також поза vim. Не впевнений, чи це буде працювати для користувачів Windows або Mac.

columnice.py суть

Використання, коли in vim.

:'<,'>!columnice =

Для цього буде використаний знак рівності як деліметр. Деліметр, однак, не викидається.


0

Я маю це у своєму .vimrc.

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

Це вирівнює стовпці, зберігаючи кому, яка може знадобитися пізніше для правильного читання. Наприклад, з Python Pandas read_csv(..., skipinitialspace=True), дякую хлопцям Pandas за цей розумний варіант, інакше in vim %s/,\s\+/,/g. Можливо, буде простіше, якщо у вас columnє варіант - вихід-роздільник, я думаю, мій немає, і я не впевнений, чому (моя сторінка для стовпця говорить про 2004 рік, на ubuntu 18.04, не впевнений, що ubuntu отримає нову версію) . У всякому разі, це працює для мене, і коментуйте, якщо у вас є якісь пропозиції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.