在 Ubuntu 中编辑 CSV 文件的好方法是什么?
这些文件看起来像这样:
This,is,data,with,a,header
2,2,3,4,,
1,,3,,6,6
,5,3,5,5,6
1,2,,,,
1,2,3,4,8,6
1,,9,,5,9
-1,,3,4,5,6
1,2,0,4,5,6
我一直在使用 OpenOffice,但需要大约 5 次单击才能关闭引用所有字段的默认行为。
我想找到一些轻量且易于使用的东西,可以插入/删除数据和基于列的排序。
答案1
对于 vim,有一个不错的插件csv.vim。
答案2
答案3
您可以使用 gnumeric 来实现这一点。在我的系统 (Crunchbang) 上,对于像您的示例一样小的文件,leafpad 占用大约 2M 的 RAM;gnumeric 占用 4M;而 scalc (来自 LibreOffice) 占用 34M。Gnumeric 显然是轻量级的,它应该在打开文件时正确检测您的分隔符。
但是(有一个但是……)gnumeric 不允许您保存修改后的文件,除非您通过菜单。下面是一个 BASH 脚本来解决这个问题。该脚本依靠 xsel(轻量级命令行剪贴板管理器)将修改后的电子表格内容粘贴回您的文件中。如果来源(不运行),此脚本让您访问两个函数,gn 在 gnumeric 中打开文件:
gn filename
并使用 gp 将内容粘贴回文件并关闭 gnumeric:
gp
(就我个人而言,我将这个脚本放在我的 .bashrc 中,以便在我打开终端时可以使用 gn 和 gp 函数。)
#! /bin/bash
# once sourced by the shell, this script provides two functions:
# gn to open a file with gnumeric
# gp to update the file with gnumeric's selection
# requires grep, sed, awk, and the xsel utility
# name of the target file: used in gn () and gp ()
# ==================================================
gn_file=
# take note of target file and open it with gnumeric if not already opened
# ==================================================
gn () {
# sanity checks
if [[ -z $1 ]]; then
echo 'Usage: gn file'
return
fi
if ! [[ -f $1 && -r $1 ]]; then
echo "Cannot find/use $1"
return
fi
# yes, this is right; job report, if any, has "$gn_file" not expanded
if jobs -l | grep 'Running.* gnumeric "$gn_file"' > /dev/null; then
echo 'Already editing with gnumeric.'
return
fi
echo 'Once done, select the part of the spreadsheet you want to save,'
echo 'press Ctrl-C, go back to the command line, and type gp [ENTER].'
# do the job
gn_file=$1
gnumeric "$gn_file" &
}
# paste selection into target file and close gnumeric
# ==================================================
gp () {
# sanity checks
if [[ -z $gn_file || ! -f $gn_file ]]; then
echo 'Cannot find/use target file.'
return
fi
local gnumeric_job=$( jobs -l | grep 'Running.* gnumeric "$gn_file"' )
if [[ -z $gnumeric_job ]]; then
echo 'No gnumeric instance to paste from.'
return
fi
if [[ -z $( xsel -ob ) ]]; then
echo 'Nothing to paste.'
return
fi
local temp_file=$( mktemp "$PWD/temp.XXXXXX" )
# paste X selection (o = output, b = clipboard mode)
xsel -ob > "$temp_file"
# replace tabs to get a CSV file
local tab=$'\t'
sed --in-place "s/$tab/,/g" "$temp_file"
# must close gnumeric before updating file
local job_id=$( echo "$gnumeric_job" | awk '{print $2}' )
kill "$job_id"
mv --backup "$temp_file" "$gn_file"
echo "$gn_file updated."
}
正如脚本本身在使用 gnumeric 打开文件时会告诉您的那样,当您完成编辑后,您必须选择要保存的电子表格部分,然后按 Ctr-C(将此部分复制到剪贴板)。返回命令行(Alt-Tab),输入 gp 将使用剪贴板的内容更新您的文件并关闭 gnumeric。您修改的值不会用引号括起来,但它们将由制表符分隔;因此,脚本使用 sed 将制表符替换为逗号。
我发现这是从命令行处理 CSV 数据文件的有效方法。只要逗号分隔的字段中不包含制表符(您的数据分析示例中似乎就是这种情况),脚本就应该可以正确保存文件。