首页 > 技术文章 > bash检查文件格式

ryansunyu 原文

情形描述:最近在做一个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

推荐阅读