CSV是一种以逗号分隔值的文本文件,常用于电子表格程序,如 Microsoft Excel 或 OpenOffice Calc。CSV 文件中的每一行代表数据库中的一行,而每行数据又由一个或多个以逗号分隔的字段组成。
针对典型的CSV数据处理场景,以下将结合Vim内置命令、操作系统命令和csv.vim插件进行操作演示。
您也可以使用Rainbow CSV等其他插件执行类似操作。
安装配置
推荐使用minpac等插件管理器,来安装GitHub上的csv.vim插件。(请参阅官方安装文档)
固定标题行
通过以下步骤,将文件拆分在两个水平窗口中显示并绑定滚动,可以保持标题行始终置顶显示:
- 打开CSV文件,使用
:set nowrap命令,取消折行显示; - 使用
:sp命令,水平分割窗口,然后点击1Ctrl-w_快捷键,调整窗口尺寸仅显示首行; - 点击Ctrl-wj快捷键,跳转到下一窗口;
- 使用
:set scrollopt=hor命令,显示横向滚动条;使用:set scrollbind命令,绑定滚动; - 点击Ctrl-wk快捷键,跳转到上一窗口;
- 使用
:set scrollbind命令,绑定滚动;
此时在文件中左右移动,标题行与内容将自动同步对齐:
使用csv.vim插件,执行以下命令可以固定标题行:
:Header
执行以下命令可以取消固定标题行:
:Header!
按列对齐
假设有以下逗号分割的CSV文件,如下图红线所示,数据列没有对齐:
在Linux中,使用过滤器(Filter)执行外部column命令来按列对齐:
:%!column -t
使用csv.vim插件,执行以下命令可以按列对齐:
:%ArrangeColumn
按列排序
调用外部sort命令,可以按照第2列进行排序:
:%!sort -t ',' -k2
使用csv.vim插件,执行以下命令可以按照第2列进行排序:
:Sort 2
按列合并
假设names.txt文件,包含姓名信息:
Jason Cameron Tim
假设numbers.txt文件,包含电话信息:
555-1234 555-9876 555-2468
使用以下Linux命令,可以将多个文件按列合并:
$ paste names.txt numbers.txt
按行合并
在Windows中,使用copy命令可以合并多个文件:
$ copy *.csv merged-filname.csv
在Linux中,使用cat命令可以合并多个文件:
$ cat *.csv > merged-file.csv
拆分文件
调用外部split命令,可以按照制定行数拆分成多个文件:
$ split -l200 passengers.csv --verbose
creating file ‘xaa’ creating file ‘xab’ creating file ‘xac’ creating file ‘xad’ creating file ‘xae’
调用外部 wc.命令,可以统计文件包含的行数,以验证拆分的结果:
$ wc -l xa*
200 xaa 200 xab 200 xac 200 xad 92 xae 892 total
删除空行
使用以下全局命令,可以删除所有空行:
:%g/^ *$/d
在Linux中,使用以下任一命令都可以删除所有空行:
$ sed '/^$/d' old.csv > new.csv
$ grep . old.csv > new.csv
$ awk NF old.csv > new.csv
$ cat old.csv | tr -s '\n' new.csv
删除重复行
使用sort命令,将删除重复行并对文本进行排序(请注意,这将改变文本行的原有顺序):
:sort u
使用以下全局命令,可以删除所有重复行:
:g/^\(.*\)$\n\1$/d
在Linux中,使用过滤器(Filter)执行外部uniq命令可以删除所有重复行:
:%!uniq
数据统计
使用以下命令,可以查找并计数行内的逗号数量
:s/,/,/gn
使用csv.vim插件,执行以下命令可以显示当前行的列数:
:NrColumns!






