您好,我有以下csv文件:
- file1.csv:
1,2,3
asjkhfajsdkfasdj,2,iasuhdsg;ghasdgjklh
<>A<SF@!*AFSL<,ahsodgasdklgjaskd2152351235,12
hello,world,!
我想验证上述csv文件是否具有以下结构(3个值(任意字符),用2个逗号分隔):
value1,value2,value3
而不是以下任何模式:
value1
value1,
value1,value2
value1,value2,
value1,value2,value3,
value1,value2,value3,value4
我尝试使用此命令(see link here):
CSVcnt=`awk 'BEGIN{FS=","}END{print NF}' $csv_file`
echo "CSVcnt = $CSVcnt"
上述命令将返回正确的3。
但让我们使用以下内容来考虑以下场景:
- file2.csv
1,2,3,4,5,6,7,8,9,10
1,2,3
1,2,3
1,2,3
将返回3,这是***不正确的***
- file3.csv
1,2,3
1,2,3
1,2,3
1,2,3,4,5,6,7,8,9,10
将返回10,这是***正确的***
- file4.csv
1,2,3
1,2,3
1,2,3,4,5,6,7,8,9,10
1,2,3,4
将返回4,这是***不正确的***
所以,看起来我使用的awk
命令只基于最后一行。您能建议一下是否有一种方法可以使用awk命令返回整个文件中找到的最大数量吗?请注意,我不喜欢使用REGEX,如果可能的话,我也不喜欢使用for循环。(每个csv将有10K到40K行)
3条答案
按热度按时间0s0u357o1#
如果你只想得到
NF
,那么你可以这样做:34gzjxbg2#
如果你想计算田地的数量
产生了类似于
以你为例
0yycz8jy3#
如果你不担心带引号的字段(它可以包含换行符和不是字段分隔符的文本逗号),也许可以尝试两遍解决方案。
以打印具有与“正常”数目不同数目的字段的所有行(通过建立对于文件中的最大数目的行为真的计数来简单地确定“正常”数目)。
如果还想打印最后一个字段为空的行,可以添加
在最后一个条件之前。
单独在Awk中很难找到合适的解决方案,但使用Python则相当简单;标准库中的
csv
模块处理CSV的几种方言,并正确处理引用字段等。