цикл не проходит через каждый набор строк в валидаторе CSV - PullRequest
0 голосов
/ 26 февраля 2019

Правильно, у меня есть этот код

for line in npp_test_file.csv
awk -F, '
BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")" } 
NF!=17 { print "incorrect   amount    of fields"; exit }
!($1~/^("[A-Z0-9]{1,25}")$/) {print "1st field invalid";}
!($2~/("[[:digit:]]{1,3}")$/) {print "2nd field invalid";}
!($3~/^("[A-Z0-9]{1,8}")$/) {print "3rd field invalid";}
!($4~/^("[A-Z0-9]{0,1}")$/) {print "4th field invalid";}
!($5~/^("[A-Z0-9]{0,11}")$/) {print "5th field invalid";}
!($6~/^("")$/) {print "6th field invalid";}
!($7~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/B) {print "7th field invalid";}
!($8~/^("[1-5]{1}")$/) {print "8th field invalid";}
!($9~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/) {print "9th field invalid";}
!($10~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/) {print "10th field invalid";}
!($11~/^("([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")|""$/) {print "11th field invalid";}
!($12~/^("([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")|""$/) {print "12th field invalid";}
!($13~/^("[A-Za-z0-9]{0,70}")|""$/) {print "13th field invalid";}
!($14~/^("[A-Za-z0-9]{1}")|""$/) {print "14th field invalid";}
!($15~/^("[0-9]{0,3}")$/) {print "15th field invalid";}
!($16~/^(".+")$/) {print "16th field invalid";}
!($17~/^(".+")|""$/) {print "17th field invalid";}
{print "you have 17 fields";
exit}' $line
done

Теперь этот код предназначен для того, чтобы взять данные, хранящиеся в npp_test_file.csv, а затем разделить их на 17 полей и затем присвоить каждое из этих полей переменной.чтобы затем можно было проверить, каждое поле соответствует набору заданных критериев.

однако из-за того, что файлы имеют более одного набора из 17 полей, они могут иметь более 100 или более в одном файле.Мне нужен способ, чтобы программа зацикливалась на каждой строке, хотя мой код for line работал бы, но это не так.

пример данных в CSV-файле

"AAA0002","112","BA001000","","HG55USW","","2018-06-21","1","2018-06-21","2018-06-21","11:26:30","11:26:30","colchester","2","003","some form of string",""
"ABC0004","a009","BAV01000","A","HG43FHG","","2018-06-21","1","2018-06-21","2018-06-21","11:26:30","11:26:30","bridgend","1","112","a second form of string ",""
"aADF0005","s012","BA0Q1000","1","CV63LTG","","2018-06-21","1","2018-06-21","2018-06-21","11:26:30","11:26:30","london","1","112","another form of string","none"

thisдолжен вывести на экран «поле 1 недопустимо, а поле 2 недействительно»

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Не могли бы вы попробовать следующее (поскольку образцы НЕ присутствуют, поэтому не проверяли его).

awk '
BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")" } 
NF!=17 { print "incorrect   amount    of fields"; next}
!($1~/^("[A-Z0-9]{1,25}")$/) {print "1st field invalid";}
!($2~/("[[:digit:]]{1,3}")$/) {print "2nd field invalid";}
!($3~/^("[A-Z0-9]{1,8}")$/) {print "3rd field invalid";}
!($4~/^("[A-Z0-9]{0,1}")$/) {print "4th field invalid";}
!($5~/^("[A-Z0-9]{0,11}")$/) {print "5th field invalid";}
!($6~/^("")$/) {print "6th field invalid";}
!($7~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/B) {print "7th field invalid";}
!($8~/^("[1-5]{1}")$/) {print "8th field invalid";}
!($9~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/) {print "9th field invalid";}
!($10~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/) {print "10th field invalid";}
!($11~/^("([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")|""$/) {print "11th field invalid";}
!($12~/^("([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")|""$/) {print "12th field invalid";}
!($13~/^("[A-Za-z0-9]{0,70}")|""$/) {print "13th field invalid";}
!($14~/^("[A-Za-z0-9]{1}")|""$/) {print "14th field invalid";}
!($15~/^("[0-9]{0,3}")$/) {print "15th field invalid";}
!($16~/^(".+")$/) {print "16th field invalid";}
!($17~/^(".+")|""$/) {print "17th field invalid";}
{print "you have 17 fields"}' npp_test_file.csv

Ниже приведены исправления, сделанные в попытке ОП:

1- Удалено *Цикл 1006 *, поскольку awk может считывать сам файл Input_file, и, кроме того, OP выглядит как чтение только 1 файла Input_file.

2 - удален exit из условия NF, в противном случае он НЕ будет проверять все условия.

3- Удалено -F из вашего кода, когда вы даете FPAT, тогда вам это не нужно. ИМХО.

4- Удалено 2-е exit из команды print, когда найдено 17 полейтоже.



РЕДАКТИРОВАТЬ: В случае, если вы хотите перейти к следующей строке, когда любое поле является недействительным (даже одно поле), вы можете добавитьnext к условиям, например.

awk '
BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")" } 
NF!=17 { print "incorrect   amount    of fields"; next}
!($1~/^("[A-Z0-9]{1,25}")$/) {print "1st field invalid"; next}
!($2~/("[[:digit:]]{1,3}")$/) {print "2nd field invalid"; next}
!($3~/^("[A-Z0-9]{1,8}")$/) {print "3rd field invalid"; next}
!($4~/^("[A-Z0-9]{0,1}")$/) {print "4th field invalid"; next}
!($5~/^("[A-Z0-9]{0,11}")$/) {print "5th field invalid"; next}
!($6~/^("")$/) {print "6th field invalid"; next}
!($7~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/B) {print "7th field invalid"; next}
!($8~/^("[1-5]{1}")$/) {print "8th field invalid"; next}
!($9~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/) {print "9th field invalid"; next}
!($10~/^("[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}")$/) {print "10th field invalid"; next}
!($11~/^("([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")|""$/) {print "11th field invalid"; next}
!($12~/^("([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")|""$/) {print "12th field invalid"; next}
!($13~/^("[A-Za-z0-9]{0,70}")|""$/) {print "13th field invalid"; next}
!($14~/^("[A-Za-z0-9]{1}")|""$/) {print "14th field invalid"; next}
!($15~/^("[0-9]{0,3}")$/) {print "15th field invalid"; next}
!($16~/^(".+")$/) {print "16th field invalid"; next}
!($17~/^(".+")|""$/) {print "17th field invalid"; next}
{print "you have 17 fields"}' npp_test_file.csv


EDIT2: Вдохновленный решением @ NeronLeVelu здесь.Модификация его решения для создания автоматического массива из REGEX (который будет использоваться для проверки различных полей).Хотя я не проверял его, так как нет подходящих образцов, как упоминалось ранее.

awk '
   BEGIN{
      FPAT = "([^,]+)|(\"[^\"]+\")"
      Fld = 0
      num=split("^(\"[A-Z0-9]{1,25}\")$,(\"[[:digit:]]{1,3}\")$,^(\"[A-Z0-9]{1,8}\")$,^(\"[A-Z0-9]{0,1}\")$,^(\"[A-Z0-9]{0,11}\")$,^(\"\")$,^(\"[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}\")$,^(\"[1-5]{1}\")$,^(\"[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}\")$,^(\"[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}\")$,^(\"([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\")|\"\"$,^(\"([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\")|\"\"$,^(\"[A-Za-z0-9]{0,70}\")|\"\"$,^(\"[A-Za-z0-9]{1}\")|\"\"$,^(\"[0-9]{0,3}\")$,^(\".+\")$,^(\".+\")|\"\"$", array",")
      for(i=1;i<=num;i++){
         regex[i]=array[i]
      }

    NF != 17 { 
       printf( "Line %3d : incorrect amount of fields\n", NR )
       next
       }

    {
    for (Idx=1; Idx<=num; Idx++ ) {
       if ( $Idx !~ regex[Idx] ) {
          printf( "Line %3d : %2dth field is invalid\n", NR, Idx )
          }
       }
    }'  Input_file
0 голосов
/ 26 февраля 2019

более общая версия, где вы помещаете все проверки шаблонов в массив, чтобы их было легче адаптировать к другим счетчикам полей, я использую Fld var с автоматическим приращением, но вы можете поставить прямой индекс, если хотите):

awk -F ',' '
   BEGIN{
      FPAT = "([^,]+)|(\"[^\"]+\")"
      Fld = 0

      Pat[++Fld]="^(\"[A-Z0-9]{1,25}\")$"
      Pat[++Fld]="(\"[[:digit:]]{1,3}\")$"
      Pat[++Fld]="^(\"[A-Z0-9]{1,8}\")$"
      Pat[++Fld]="^(\"[A-Z0-9]{0,1}\")$"
      Pat[++Fld]="^(\"[A-Z0-9]{0,11}\")$"
      Pat[++Fld]="^(\"\")$"
      Pat[++Fld]="^(\"[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}\")$"
      Pat[++Fld]="^(\"[1-5]{1}\")$"
      Pat[++Fld]="^(\"[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}\")$"
      Pat[++Fld]="^(\"[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}\")$"
      Pat[++Fld]="^(\"([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\")|\"\"$"
      Pat[++Fld]="^(\"([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\")|\"\"$"
      Pat[++Fld]="^(\"[A-Za-z0-9]{0,70}\")|\"\"$"
      Pat[++Fld]="^(\"[A-Za-z0-9]{1}\")|\"\"$"
      Pat[++Fld]="^(\"[0-9]{0,3}\")$"
      Pat[++Fld]="^(\".+\")$"
      Pat[++Fld]="^(\".+\")|\"\"$"
      }

    NF != 17 { 
       printf( "Line %3d : incorrect amount of fields\n", NR )
       next
       }

    {
    for (Idx=1; Idx<=Fld; Idx++ ) {
       if ( $Idx !~ Pat[Idx] ) {
          printf( "Line %3d : %2dth field is invalid\n", NR, Idx )
          }
       }
    }

    { printf( "Line %3d : you have 17 fields\n", NR ) }
    ' npp_test_file.csv
0 голосов
/ 26 февраля 2019

Если вы удалите это exit из последнего блока (и пока вы там, удалите это -F,, вам это не нужно и FPAT):

...
{print "you have 17 fields";
exit}

становится

...
{
    print "you have 17 fields"
}

вывод будет

you have 17 fields
2nd field invalid
you have 17 fields
1st field invalid
2nd field invalid
you have 17 fields

Это то, что вы искали с поле одно недействительно, а поле два недействительно "?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...