как проверить правильность CSV-файла с двумя полями

Используйте debugfs на ext2/3/4. Сначала найдите индекс на основе блока:

debugfs -D -R "icheck $sda3block4096" /dev/sda3

затем используйте этот номер инода для запроса файла:

debugfs -D -R "ncheck $inode" /dev/sda3
0
23.07.2020, 19:54
5 ответов

Попробуйте это:

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

If будет устанавливать флаг 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
2
18.03.2021, 23:17

Другой параметр awk:

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

Он явно проверяет, пусто ли какое-либо из двух полей. Если это так, он печатает сообщение и немедленно завершает работу с кодом ошибки 5 (этот номер произвольный, выберите тот, который вам больше всего нравится ).

3
18.03.2021, 23:17

Я не уверен, но ДУМАЮ, что вы ищете:

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

, который можно улучшить, чтобы сообщать о конкретной ошибке (s )в строке:

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
2
18.03.2021, 23:17

Вот небольшая функция, использующая grep. Его код выхода будет равен 0, если нет недопустимых строк, и будет равен 1, если хотя бы 1 недопустимая строка (в этом случае печатается первая недопустимая строка и обработка прерывается -дальнейшие строки не проверяются ).

Используемое регулярное выражение означает в начале строки один или несколько символов, не являющихся запятыми, за которыми следует 1 запятая, а затем один или несколько символов, не являющихся запятыми. запятая, а дальше ничего .

lines_are_valid() {
  grep -E -m1 -v '^[^,]+,[^,]+$' && return 1 || return 0
}

Как пользоваться:

cat myFile | lines_are_valid

Еще примеры:

echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,' \
| lines_are_valid \
  && echo "All lines OK" \
  || echo "Invalid line found, see above"

look_on_the_room,

Invalid line found, see above

echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,aaa' \
| lines_are_valid \
  && echo "All lines OK" \
  || echo "Invalid line found, see above"

All lines OK

echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,
also wrong,' \
| lines_are_valid \
  && echo "All lines OK" \
  || echo "Invalid line found, see above"

look_on_the_room,,

Invalid line found, see above

echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,asdfasdf
also wrong,' \
| lines_are_valid \
  && echo "All lines OK" \
  || echo "Invalid line found, see above"

look_on_the_room,,asdfasdf

Invalid line found, see above

Если вы хотите показать все недопустимые строки:

show_all_invalid_lines() {
  grep -E -v '^[^,]+,[^,]+$' && return 1 || return 0
}
2
18.03.2021, 23:17

Входной файл

 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 -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

Питон

#!/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
-1
18.03.2021, 23:17

Теги

Похожие вопросы