переформатируйте в vim для получения удобного расположения столбцов

StackOverflow https://stackoverflow.com/questions/1229900

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

:%!column -t

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

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

Другие советы

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

<Ол>
  • Выберите разделитель. В посте ОП это запятая, в моем примере это =.
  • Добавьте пробелы до / после него. Для этого я использую s/=/= ...spaces... / в визуальном отборе.
  • Найдите самое длинное слово и поместите курсор после него.
  • Удалите все лишние пробелы, используя dw и вертикальное перемещение.
  • Пример этой техники продемонстрирован ниже:

    Пример

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

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

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

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

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

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

    :%Align ,\zs
    

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

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

    qa0f:w100i <Esc>19|dwjq4@a
    

    Обратите внимание на один пробел после 100i и < Esc > означает " нажмите escape " - не вводите " < 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)
    

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

    :%ArrangeColumn
    

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

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

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

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

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

    :set nowrap
    :%!column -t
    

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

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

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

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

    [sudo -H] pip3 install tablign
    

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

    :'<,'>:!tablign
    

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

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

    columnice.py gist

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

    :'<,'>!columnice =
    

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

    Здесь & # 8217; это чистый ответ скрипта Vim, без плагинов, без макросов:

    Может быть, лучше всего начать с решения моей проблемы & # 8217; в качестве примера. Я выбрал строки кода, на которые хотел повлиять, затем использовал следующую команду (напомним, что при переходе в командный режим из визуального режима автоматически добавляется & # 8220; '& Lt;,' & Gt; & # 8221 ;, так что действует на визуальный диапазон):

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

    За исключением того, что я на самом деле НЕ печатал & # 8220; < 0d > & # 8221 ;. Вы можете ввести непечатаемые символы в командной строке, нажав Ctrl-V, а затем клавишу, которую вы хотите ввести. # 8220 &; & Л; 0d GT &; & # 8221; это то, что отображается в командной строке после ввода & # 8216; ctrl-v enter & # 8217 ;. Здесь он & # 8217; проанализирован & # 8220; нормальным & # 8221; команда как выход из & # 8220; / & # 8221; режим поиска. Затем курсор переходит на & # 8220; & Значение # 8221; в текущей строке.

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

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

    Здесь & # 8217; кое-что, что я недавно узнал: если вы запутались в сложной команде командного режима, отмените с & # 8216; u & # 8217; (если это повлияло на буфер), нажмите & # 8220; q: & # 8221; ввести специальный буфер истории команд, который действует так же, как обычный буфер. Отредактируйте любую строку и нажмите ввод, и измененная команда вводится как новая команда. Незаменим, если вы не хотите & # 8217; не хотеть напрягаться из-за идеальной постановки всего в первый раз.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top