在vim中重新格式化以获得漂亮的列布局

Ste*_*ini 120 vim reformat

我在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
Run Code Online (Sandbox Code Playgroud)

如您所见,数字格式不同且未对齐.在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
Run Code Online (Sandbox Code Playgroud)

使用ctrl-v复制和粘贴部分会很棒.任何提示?

sun*_*256 253

如果你使用某种UNIX(Linux等),你可以通过column(1)命令欺骗和过滤它.

:%!column -t
Run Code Online (Sandbox Code Playgroud)

上面将解析字符串文字中的分隔符,这是错误的,因此您可能需要预处理步骤并为此文件指定分隔符,例如:

%!sed 's/","/\&/' | column -t -s '&'
Run Code Online (Sandbox Code Playgroud)

  • 棒极了!只需添加,它也适用于视觉选择`:'<,'>!column -t` (27认同)
  • 因为我的文件没有空格我不得不使用`:%!column -t -s','`.它删除了逗号,因此它们不再是技术csv文件.但是安排得很漂亮,这就是我所需要的. (24认同)
  • 任何人都知道使用列中带逗号的引用列的解决方案吗?示例"2151 Main ST Houston,TX" (2认同)
  • @metrix,这是一个*非常*笨拙的解决方法:1)将分隔符内的空格转换为不同的字符,2)然后运行`column`,如帖子中所述,3)然后将分隔符替换回空格.步骤#1的可视模式下的示例命令是:`'<,'> s /"\(\ w\+ \)\(\ w\+ \)"/"\ 1\\ 2"/ g` (2认同)

rr-*_*rr- 51

有时我们只想对齐两列.在这种情况下,我们不需要任何插件,可以使用像这样的纯Vim功能:

  1. 选择一个分隔符.在OP的帖子中,这是一个逗号,在我的例子中是这样的=.
  2. 在它之前/之后添加空格.我用它s/=/= ...spaces... /进行视觉选择.
  3. 找到最长的单词并将光标放在其后面.
  4. 使用dw和垂直移动删除所有额外的空格.

以下说明此技术的示例:

例

我发现自己不需要经常调整内容以安装另一个插件,所以这是我实现它的首选方式 - 特别是它不需要太多思考.

  • 你是怎么做那个漂亮的GIF的? (4认同)
  • 在`:s/=/= /`之后,最好使用`Ctrl + V`选择正确的列,然后使用`<<`和`.`对齐重复.在这里找到它:http://stackoverflow.com/a/24704379/2152384 (4认同)

DrA*_*rAl 24

正如sunny256所说,这个column命令在Unix/Linux机器上是一个很好的方法,但是如果你想在纯Vim中这样做(这样它也可以在Windows中使用),最简单的方法是安装Align插件然后做:

:%Align ,
:%s/\(\s\+\),\s/,\1/g
Run Code Online (Sandbox Code Playgroud)

第一行对齐逗号上的条目,第二行移动逗号,使其与前面的值齐平.您可以使用它AlignCtrl来定义一次完成整个批次的自定义映射,但我永远不会记得如何使用它...

编辑

如果您不介意条目之间有两个空格而您想在一个命令中执行此操作,您还可以执行以下操作:

:%Align ,\zs
Run Code Online (Sandbox Code Playgroud)


zcr*_*r70 6

这是使用vim宏的一个很好的答案:https://stackoverflow.com/a/8363786/59384 - 基本上,你开始录制宏,格式化第一列,停止录制然后重复所有剩余行的宏.

复制/粘贴答案:

qa0f:w100i <Esc>19|dwjq4@a
Run Code Online (Sandbox Code Playgroud)

注意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)
Run Code Online (Sandbox Code Playgroud)


rr-*_*rr- 6

现在,我们还有由junegunn编写的神话般的EasyAlign插件。

从自述文件中演示GIF:


Daa*_*aan 5

你可以使用csv.vim插件。

:%ArrangeColumn
Run Code Online (Sandbox Code Playgroud)

但是,这不会完全按照您的要求执行:它会正确调整单元格的内容,而您的值按小数点或第一位对齐。

该插件还有许多其他有用的命令来处理 CSV 文件。