переформатировать в vim для хорошего расположения колонок - PullRequest
113 голосов
/ 05 августа 2009

У меня есть этот набор данных в 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. Есть намеки?

Ответы [ 12 ]

245 голосов
/ 05 августа 2009

Если вы работаете в какой-то UNIX (Linux и т. Д.), Вы можете обмануть и отфильтровать ее с помощью команды column (1).

:%!column -t

Вышеприведенное будет анализировать разделители внутри строковых литералов, что неверно, поэтому вам, вероятно, потребуются шаги предварительной обработки и указание разделителя для этого файла, например:

%!sed 's/","/\&/' | column -t -s '&'
47 голосов
/ 09 февраля 2015

Иногда мы хотим выровнять только два столбца. В этом случае нам не нужны никакие плагины, и мы можем использовать чистую функциональность Vim, например:

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

Пример этой техники продемонстрирован ниже:

Example

Мне не нужно выравнивать вещи достаточно часто, чтобы установить другой плагин, так что это был мой предпочтительный способ сделать это - особенно потому, что он не требует много размышлений.

24 голосов
/ 05 августа 2009

Как предположил sunny256, команда column - отличный способ сделать это на машинах с Unix / Linux, но если вы хотите сделать это в чистом Vim (так, чтобы его можно было использовать и в Windows), самый простой способ установить плагин Align и затем выполнить:

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

Первая строка выравнивает записи через запятую, а вторая перемещает запятую так, чтобы она совпадала с предыдущим значением. Возможно, вы сможете использовать AlignCtrl для определения пользовательского сопоставления, которое выполняет всю работу за один раз, но я никогда не могу вспомнить, как его использовать ...

Редактировать

Если вы не возражаете против двух пробелов между записями и хотите сделать это одной командой, вы также можете сделать:

:%Align ,\zs
6 голосов
/ 05 июня 2014

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

Копировать / вставить из этого ответа:

qa0f:w100i <Esc>19|dwjq4@a

Обратите внимание на один пробел после 100i, а означает «нажатие клавиши» - буквально не печатайте «».

Перевод:

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)
6 голосов
/ 06 января 2014

Кроме того, Tabularize довольно хорошо http://vimcasts.org/episodes/aligning-text-with-tabular-vim/

3 голосов
/ 03 января 2017

Теперь у нас также есть потрясающий плагин EasyAlign , написанный junegunn.

Демонстрационный GIF от README:

3 голосов
/ 17 января 2014

Вы можете использовать плагин csv.vim .

:%ArrangeColumn

Однако это не будет делать именно то, что вы просили: оно будет корректно корректировать содержимое ячеек, в то время как ваши значения будут выровнены по десятичной точке или по первой цифре.

Плагин имеет много других полезных команд для работы с CSV-файлами.

2 голосов
/ 25 октября 2013

также, если у вас очень длинные столбцы, может быть удобно отключить перенос по умолчанию

:set nowrap
:%!column -t

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

1 голос
/ 12 февраля 2018

Я только что написал tablign для этой цели. Установить с

[sudo -H] pip3 install tablign

Затем просто пометьте таблицу в vim и выполните

:'<,'>:!tablign

enter image description here

1 голос
/ 05 октября 2015

Довольно старый вопрос, но я недавно воспользовался отличным плагином vim, который позволяет форматировать таблицы «на лету» или «по факту» (в зависимости от ситуации):

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

...