Переформатировать в vim для хорошей компоновки столбцов

У меня есть этот набор данных в файле 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. Любые подсказки?

Ответ 1

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

:%!column -t

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

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

Ответ 2

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

  • Выберите разделитель. В OP post это запятая, в моем примере это =.
  • Добавить пробелы до/после него. Я использую s/=/= ...spaces... / для визуального выбора для этого.
  • Найдите самое длинное слово и поместите курсор после него.
  • Удалите все лишние пробелы, используя dw и вертикальное перемещение.

Пример этого метода, продемонстрированного ниже:

Example

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

Ответ 3

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

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

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

Изменить

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

:%Align ,\zs

Ответ 5

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

Скопируйте/вставьте из этого ответа:

qa0f:w100i <Esc>19|[email protected]

Обратите внимание на один пробел после 100i, и <Esc> означает буквально "escape escape" --don, наберите "<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
[email protected]        -- run the macro 4 times (for the remaining 4 lines)

Ответ 6

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

:%ArrangeColumn

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

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

Ответ 7

Теперь у нас есть сказочный плагин EasyAlign, написанный junegunn.

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

Ответ 8

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

:set nowrap
:%!column -t

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

Ответ 9

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

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

Ответ 10

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

[sudo -H] pip3 install tablign

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

:'<,'>:!tablign

enter image description here

Ответ 11

Я написал python script, который позволяет пользователям базово columize любой тип текста также вне vim. Не уверен, что это будет работать для пользователей Windows или Mac.

columnice.py gist

Использование в vim.

:'<,'>!columnice =

В качестве разделителя будет использоваться знак равенства. Изделие не выбрасывается.

Ответ 12

Вот чистый ответ сценария Vim, без плагинов, без макросов:

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

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

За исключением того, что я на самом деле не набрал "<0d>". Вы можете ввести непечатаемые символы в командной строке, нажав Ctrl-V, а затем клавишу, которую вы хотите ввести. "<0d>" - это то, что отображается в командной строке после ввода "ctrl-v enter". Здесь он анализируется командой "normal" как выход из режима поиска "/". Затем курсор переходит на "значение" в текущей строке.

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

Я оставил поисковый термин для команды: g (lobal) пустым, поскольку мы использовали визуальный блок и хотели повлиять на каждую строку, но вы можете прекратить использование визуального выделения (и "'<,'>") и поставить поисковый термин вместо этого. Или объедините визуальный выбор и поисковый запрос, чтобы более точно/легко сузить круг вопросов.

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