如何检查具有两个字段的 csv 文件的有效性

如何检查具有两个字段的 csv 文件的有效性

我有简单的 csv 文件,应仅包含两个非空字段,如下所示

这是正确的 csv 文件的示例

$ more file.csv    
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
.
.
.

目标是检查 csv 文件是否仅包含两个非空字段。

我从以下 awk 开始检查文件是否只有两个字段

awk 'BEGIN{FS=OFS=","} NF!=2{print "not enough fields" }' file.csv

但在下面的例子中它没有给出“没有足够的字段”,这是不行的。

why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,

其他错误 csv 文件的示例:

why_we_need_help,,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200,
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200,

或者

why_we_need_help log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,

答案1

另一个 awk 选项是

awk 'BEGIN{FS=OFS=","}NF!=2||$1==""||$2==""{print "Not enough fields";exit 5}' file.csv

它明确检查两个字段中是否有任何一个为空。如果是这样,它会打印该消息并立即退出,并显示错误代码 5(该数字是任意的,选择您最喜欢的一个)。

答案2

尝试这个:

awk 'BEGIN{FS=OFS=","} f{skip} NF!=2||!length($1)||!length($2){f=1} END{if (f) {print "File contains malformed lines"; exit 1}}' file.csv

f每当文件不包含两个,分隔字段或任何两个必填字段为空时,如果将设置一个标志。最后,如果在解析文件时设置了标志,它会打印一条消息,并以错误代码 1 退出(根据您的请求)。

如果已经设置了标志,第一条规则将跳过解析该行,以加快进程,因为您只想知道是否存在任何格式错误的行 - 因此一旦找到这样的行,我们就知道该文件格式错误并且不需要考虑文件的其余部分。

如果您想知道有多少行格式错误,这个小更改将打印它:

awk 'BEGIN{FS=OFS=","} NF!=2||!length($1)||!length($2){f++} END{if (f) {printf("File contains %d malformed line(s)\n",f); exit 1}}' file.csv

答案3

我不确定,但我认为您正在寻找的是:

awk -F',' 'NF!=2 || /^,|,$/{print "bad:", NR | "cat>&2"; exit 1}' file

可以改进以报告线路上的特定错误:

awk -F',' '
    NF<2 { err="too few fields" }
    NF>2 { err="too many fields" }
    /^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
    err != "" { print err, "at line", NR | "cat>&2"; exit 1 }
' file

或者如果您希望一次找到所有行上的所有错误:

awk -F',' '
    NF<2 { err="too few fields" }
    NF>2 { err="too many fields" }
    /^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
    err != "" { print err, "at line", NR | "cat>&2"; err=""; f=1 }
    END { exit f }
' file

答案4

输入文件

 cat op.txt 
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
look_on_the_room, 
   ,ajay 

awk命令

awk -F "," 'NF == "2" {print $0}' filename | sed "s/,/ /g"| sed -n '/\s\{2,\}/!p'| awk '{gsub(" ",",",$0);print}'

输出

why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200

Python

#!/usr/bin/python
import re
u=re.compile(r' {2,}')
k=open('filename','r')
for i in k:
    q=re.sub(","," ",i)
    if not  re.search (u,q):
        print q.replace(" ",",").strip()

输出

why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200

相关内容