bash检查文件格式
情形描述:最近在做一个ETL的项目,用的是CLoverETL,需要在拿到文件后对文件格式进行检验,以决定是否继续。
主要功能是检查每个文件中有几个“|”符号,项目中约定以该符号来作为分隔,所以检查每个文件每行的“|”的个数。没有问题才可以插入到数据库中。
说明:
breakline=10表示如果一个文件中超过10行的格式不对,则不再计算
试了下,CloverETL这款工具中支持的通配符非常有限,所以类似Hengda_Payment_*_*_*_*这样看起来很怪的匹配方式
check_delimitor(){ delimitor="|" breakline=10 path="${DATATMP_DIR}/bash_res.txt" i=1 while read line do num=$(echo $line|grep -o $delimitor|wc -l) if [ $num != $1 ];then echo "$2|${i}|${NOW}" >> ${DATATMP_DIR}/bash_res.txt if [ $i -gt $breakline ] then echo "****More than ${i} lines format wrong in $2****" >> $path break fi fi let i++ done < ${DATATMP_DIR}/$2 } for file in `ls ${DATATMP_DIR}` do case $file in Hengda_Member_*) check_delimitor 27 $file ;; Hengda_Ticket_*) check_delimitor 7 $file ;; Hengda_Payment_*_*_*_*) check_delimitor 7 $file ;; Hengda_Payment_*) check_delimitor 9 $file ;; Hengda_Transaction_Non_Tickets_*) check_delimitor 7 $file ;; Hengda_Transaction_*) check_delimitor 14 $file ;; Hengda_Item_Non_Tickets_*) check_delimitor 6 $file ;; Hengda_Cinema_*) check_delimitor 8 $file ;; Hengda_Film_*_*) check_delimitor 6 $file ;; Hengda_Film_*) check_delimitor 10 $file ;; Hengda_Refer_*) check_delimitor 6 $file ;; *) echo "FILE NAME WRONG" ;; esac done