reformat in vim for a nice column layout

后端 未结 13 1079
野性不改
野性不改 2020-11-30 16:21

I have this dataset in a csv file

1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604,          


        
相关标签:
13条回答
  • 2020-11-30 17:01

    Pretty old question, but I've recently availed myself of an excellent vim plugin that enables table formatting either on the fly or after-the-fact (as your use case requires):

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

    0 讨论(0)
  • 2020-11-30 17:06

    also if you have very long columns it can be handy to disable default wrapping

    :set nowrap
    :%!column -t
    

    (note in debian you also have a further option for column -n which if you want to split multiple adjacent delimiters)

    0 讨论(0)
  • 2020-11-30 17:07

    Sometimes we want to align just two columns. In that case, we don't need any plugins and can use pure Vim functionality like this:

    1. Choose a separator. In OP's post this is a comma, in my example this is =.
    2. Add spaces before/after it. I use s/=/= ...spaces... / in visual selection for this.
    3. Locate to the longest word and place cursor after it.
    4. Remove all the extra whitespace using dw and vertical movement.

    Example of this technique demonstrated below:

    Example

    I don't find myself needing to align things often enough to install another plugin, so this was my preferred way of accomplishing it - especially that it doesn't require much thinking.

    0 讨论(0)
  • 2020-11-30 17:16

    If you're on some kind of UNIX (Linux, etc), you can cheat and filter it through the column(1) command.

    :%!column -t
    

    The above will parse on delimiters inside string literals which is wrong, so you will likely need pre-processing steps and specifying the delimiter for this file for example:

    %!sed 's/","/\&/' | column -t -s '&'
    
    0 讨论(0)
  • 2020-11-30 17:16

    As sunny256 suggested, the column command is a great way of doing this on Unix/Linux machines, but if you want to do it in pure Vim (so that it can be used in Windows as well), the easiest way is to install the Align plugin and then do:

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

    The first line aligns the entries on the commas and the second moves the comma so that it's flush with the preceding value. You may be able to use AlignCtrl to define a custom mapping that does the whole lot in one go, but I can never remember how to use it...

    Edit

    If you don't mind two spaces between entries and you want to do this in one command, you can also do:

    :%Align ,\zs
    
    0 讨论(0)
  • 2020-11-30 17:17

    This is a great answer using vim macros: https://stackoverflow.com/a/8363786/59384 - basically, you start recording a macro, format the first column, stop recording then repeat the macro for all remaining lines.

    Copy/pasted from that answer:

    qa0f:w100i <Esc>19|dwjq4@a
    

    Note the single space after the 100i, and the <Esc> means "press escape"--don't type "<Esc>" literally.

    Translation:

    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)
    
    0 讨论(0)
提交回复
热议问题