2つのフィールドを持つCSVファイルを検証する方法

2つのフィールドを持つCSVファイルを検証する方法

以下のように空でない2つのフィールドのみを含める必要がある単純な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ファイルに空でないフィールドが2つだけ含​​まれていることを確認することです。

ファイルにフィールドが2つしかないことを確認するには、次の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

2 つのフィールドのいずれかが空であることを明示的に確認します。その場合は、メッセージを印刷してエラーコード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ファイルに2つの,区切りフィールドが含まれていない場合、または2つの必須フィールドが空の場合は常にフラグが設定されます。最後に、ファイルの解析中にフラグがセットされると、メッセージを出力し、要求に応じてエラーコード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

関連情報