使用命令行修剪csv文件
我有非常大的包含原始数据的.csv文件。许多字段具有前导空格和尾随空格,并且许多应该在字符组/字之间仅具有一个空格的多字段字段值具有额外的空格,例如,使用命令行修剪csv文件
'12 Anywhere Street'
这应该是:
'12 Anywhere Street'
领先,尾随和额外的空间变化,从一个额外的空间六个多余的空格。我可以将文件加载到我的数据库并运行脚本来修剪它们。前后修剪脚本运行良好,并且可以快速执行;但是,删除单词之间多余空格的脚本要花费更长和更长的时间。在将它加载到我的数据库之前,使用命令行删除原始.csv文件中的单词之间的多余空格会更好。
我基本上需要运行一个替换函数,它将“”的任何实例替换为“”,“”,“”,....最多六个空格左右。我非常感谢能够实现这一点的一些协助。
在本回复的第1部分中,我将首先假设您的CSV文件有一个不在任何字段内出现的字段分隔符(称为“,”)。在第2部分中,我将处理更一般的情况。
第1部分:
awk -F, '
function trim(s) {
sub(/^ */,"",s); sub(/ *$/,"",s); gsub(/ */," ",s); return s;
}
BEGIN {OFS=FS}
{for (i=1;i<=NF;i++) { $i=trim($i) }; print }'
第2部分:
为了处理一般情况下,最好使用CSV感知工具(如Excel或csv2tsv命令之一在线工具)将CSV转换为简单的格式,其中值分隔符不会在字面值内出现。 TSV格式(带有制表符分隔的值)是特别合适的,因为它允许在选项卡中包含制表符。
然后使用awk -F"\t"
而不是awk -F,
运行上述awk命令。
要恢复原始格式,请使用诸如Excel,tsv2csv或jq之类的工具。这里是JQ咒语假设你希望有一个“标准”的CSV文件:
jq -Rr 'split("\t") | @csv'
在紧要关头,下面可能就足够了:
awk -F"\t" '
BEGIN{OFS=","; QQ="\"";}
function q(s) { if (index(s,OFS)) { return QQ s QQ }; return s}
function qq(s) { gsub(QQ, QQ QQ, s); return QQ s QQ }
function wrap(s) { if (index(s,QQ)) { return qq(s) } return q(s)}
{ s=wrap($1); for (i=2;i<=NF;i++) {s=s OFS wrap($i)}; print s}'
在Excel中编辑文件不是一个选项。如果是这样,修剪将很简单。 – pbnyc
在MacOS或Linux,你可以这样做:
cat data.csv | tr -s [:space:] > formatted.csv
这不会削减每个值,但会删除所有重复的空格。也许这会让你走。
这将删除多余的空间,但不会削减每个值。 – peak
你说得对。我澄清了。 –
你在使用什么操作系统? Linux呢?请在你的问题中提及它。你也可以举几个你的数据文件的例子吗? – Wossname
使用Windows,但可以轻松创建一个Linux实例来执行此操作。单词之间具有额外空格的列包含(按字段引用)'姓和名','街道地址','城市','字符串句子格式'。某些表/ .csv文件比其他表格有更多的空格。我希望有所帮助。 – pbnyc
消息框自动删除空格。 – pbnyc