19

有时我会收到一个 CSV 文件,该文件在单元格内有一个回车符。对于将其用作输入的程序来说,这不是可接受的格式。

为了检测输入行是否被拆分,我确定坏行中不会包含预期数量的逗号。是否有 bash 或其他常见的 unix 命令行工具可以让我计算行中的逗号?如有必要,我可以编写一个 Python 或 Perl 程序来执行此操作,但如果可能,我想在现有的 bash 脚本中添加一两行,以便在逗号计数错误时使其失败。有任何想法吗?

4

7 回答 7

57

去掉除逗号之外的所有内容,然后计算剩余的字符数:

$ echo foo,bar,baz | tr -cd , | wc -c
2
于 2012-05-30T13:40:23.103 回答
11

要计算逗号出现的次数,可以使用类似 awk 的方法:

string=(line of input from CSV file)
echo "$string" | awk -F "," '{print NF-1}'

但这确实不足以确定一个字段中是否有回车。字段可以在里面有逗号,只要它们被引号包围。

于 2012-05-30T13:41:40.933 回答
5

在纯 Bash 中:

while IFS=, read -ra array
do
    echo "$((${#array[@]} - 1))"
done < inputfile

或者

while read -r line
do
    count=${line//[^,]}
    echo "${#count}"
done < inputfile
于 2012-05-30T14:08:13.877 回答
3

试试 Perl:

$ perl -ne 'print 0+@{[/,/g]},"\n"'
a
0
a,a
1
a,a,a,a,a
4
于 2012-05-30T13:46:38.700 回答
3

比其他解决方案更适合我的是这个。如果test.txt有:

foo,bar,baz
baz,foo,foobar,bar

然后cat test.txt | xargs -I % sh -c 'echo % | tr -cd , | wc -c'产生

2
3

这对于流媒体源或拖尾日志等非常有效。

于 2020-10-15T23:41:36.750 回答
0

根据您尝试对 CSV 数据执行的操作,使用 csvquote 之类的包装脚本临时替换引用字段中有问题的换行符(和逗号),然后恢复它们可能会有所帮助。例如:

csvquote inputfile.csv | wc -l

csvquote inputfile.csv | cut -d, -f1 | csvquote -u

可能是您正在寻找的东西。查看[https://github.com/dbro/csvquote][1]代码和更多信息

于 2013-05-04T22:10:16.420 回答
-2

只需删除所有回车:

tr -d "\r" old_file > new_file
于 2012-05-30T13:46:09.427 回答