免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3111 | 回复: 8
打印 上一主题 下一主题

传票录入for Sco5.05(求助:请帮我优化一下程序) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-23 13:28 |只看该作者 |倒序浏览
脚本如下:(取大写、小写字符串长度时速度很慢,请帮我优化一下,谢谢)
注:脚本中的xx2dx为一C程序,用于将小写数字转换成大写格式。

##################信用社特种转帐贷方传票录入##################
if [ $# -ne 1 ]
   then
     clear
     echo ""
     echo "语法错误!!!\n"
     echo "格式:cplr 日期\n"
     echo "例如 cplr 20040622\n"
     exit
fi
if [ ! -f dfcp.$1 jine.$1 ]
   then
   touch dfcp.$1
   touch jine.$1
fi
YY=`echo $1 | cut -b 1-4`
MM=`echo $1 | cut -b 5-6`
DD=`echo $1 | cut -b 7-8`
brh="99999"
chr="_"
fuhao="¥"
CHOICE=3
while true
do
   clear
   echo ""
   echo ""
   echo "\t       济宁市农村信用社特种转帐贷方传票          "  
   echo "\t               ----------------"
   echo "\t                $YY年$MM月$DD日"
   echo  "\t━━━━━━━━━━━━━━━━━━━━━━━"
   echo
   echo   "\t\t   1) 传票录入"
   echo   "\t\t   2) 已录入传票统计核对"
   echo   "\t\t   3) 查看已录入传票"
   echo   "\t\t   4) 传票打印"
   echo   "\t\t   5) 传票初始化"
   echo   "\t\t   6) 联社代码查询"
   echo   "\t\t   0) 退出"
   echo
   echo  "\t━━━━━━━━━━━━━━━━━━━━━━━"
   echo  "\t\t\t请选择(0-3):\c"
   read CHOICE
   case ${CHOICE}
   in
      0)
         clear
         exit
         ;;
      1)
         while true
          do
         echo ""
         echo "\t\t请输入联社代码:\c"
         read brh
         while [ -z "$brh" ]
         do
         echo "\t\t请输入联社代码:\c"
         read brh
         done
         if [ $brh != "908[0-9][0-9]" ]
         then
           echo ""
           echo "\t\t联社代码错误,请重新输入...\c"
           echo ""
           read tmp
           break
         fi
         brh1="$brh"
         echo "\t\t请输入金额:\c"
         read jine
         if [ $jine = "0.00" ]
           then
           echo ""
           echo "\t\t  金额为零,请重新输入...\c"
           read tmp
            break
         fi
         if [ $jine = "0" ]
           then
           echo ""
           echo "\t\t  金额为零,请重新输入...\c"
           read tmp
            break
          else
         echo $jine >>jine.$1
         fi
       ##########取大写字符串长度###########
         dxjine=`xx2dx $jine `
         cou=`echo $dxjine | wc -c`
         while [ $cou -lt 48 ]
         do
         dxjine="$dxjine$chr"
         cou=`expr $cou + 1`
         done
       ##########取小写字符串长度###########
         jine="$fuhao$jine"
         cou=`echo $jine | wc -c`
         while [ $cou -lt 13 ]
         do
         jine="$chr$jine"
         cou=`expr $cou + 1`
         done
         if [ $brh = "90801" ]
           then brh="城区信用社"
           actno="23520000108"     
         fi
         if [ $brh = "90802" ]
           then brh="任城__联社"
           actno="23520000221"     
         fi
         if [ $brh = "90803" ]
           then brh="兖州__联社"
           actno="23520000334"     
         fi
         if [ $brh = "90804" ]
           then brh="曲阜__联社"
           actno="23520000447"     
         fi
         if [ $brh = "90805" ]
           then brh="泗水__联社"
           actno="23520000560"     
         fi
         if [ $brh = "90806" ]
           then brh="邹城__联社"
           actno="23520000673"     
         fi
         if [ $brh = "90807" ]
           then brh="微山__联社"
           actno="23520000786"     
         fi
         if [ $brh = "90808" ]
           then brh="鱼台__联社"
           actno="23520000802"     
         fi
         if [ $brh = "90809" ]
           then brh="金乡__联社"
           actno="23520000915"     
         fi
         if [ $brh = "90810" ]
           then brh="嘉祥__联社"
           actno="23520001028"     
         fi
         if [ $brh = "90811" ]
           then brh="汶上__联社"
           actno="23520001141"     
         fi
         if [ $brh = "90812" ]
           then brh="梁山__联社"
           actno="23520001254"     
         fi

       echo "" >>dfcp.$1
       echo "\t          信用合作社特种转帐贷方传票          " >>dfcp.$1
       echo "\t==============================================" >>dfcp.$1
       echo "\t                 $YY年$MM月$DD日" >>dfcp.$1
       echo "┏━┳━━━┳━━━━━━━━━━━━━━┳━┳━━━┳━━━━━━━━┓" >>dfcp.$1
       echo "┃付┃全  称┃济宁市农村信用社资金清算中心┃收┃全  称┃   $brh   ┃" >>dfcp.$1
       echo "┃款┣━━━╋━━━━━━━━━━━━━━┫款┣━━━╋━━━━━━━━┫" >>dfcp.$1
       echo "┃  ┃帐  号┃                            ┃  ┃帐  号┃   $actno  ┃" >>dfcp.$1
       echo "┃单┣━━━╋━━━━━┳━━┳━━━━━┫单┣━━━╋━━┳━━┳━━┫" >>dfcp.$1
       echo "┃位┃开户行┃          ┃行号┃          ┃位┃开户行┃    ┃行号┃    ┃附" >>dfcp.$1
       echo "┣━┻┳━━┻━━━━━┻━━┻━━━━━┻━┻━━━┻━━┻━━┻━━┫件" >>dfcp.$1
       echo "┃金额┃大写dxjine$jine┃" >>dfcp.$1
       echo "┣━━┻━━━┳━━━━━┳━━━┳━━━━┳━━━━━━━━━━━━━┫" >>dfcp.$1
       echo "┃原始凭证金额┃          ┃赔偿金┃        ┃ 科目(贷)                 ┃" >>dfcp.$1
       echo "┣━━━━━━╋━━━━━╋━━━╋━━━━┫                          ┃" >>dfcp.$1
       echo "┃原始凭证名称┃          ┃号  码┃        ┃ 对方科目(借)             ┃张" >>dfcp.$1
       echo "┣━━━━━━╋━━━━━┻━━━┻━━━━┫                          ┃" >>dfcp.$1
       echo "┃  转帐原因  ┃ 直连商户资金清算(银行盖章) ┃  复核    记帐    制票    ┃" >>dfcp.$1
       echo "┗━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━┛" >>dfcp.$1
       echo "" >>dfcp.$1
       echo "---------------------------------------------------------------------------" >>dfcp.$1
       echo "" >>dfcp.$1
       done
          ;;
        2)
          hj=`awk 'BEGIN{aa=0.00}{aa=aa+$1}END{printf ("%.2f",aa)}' jine.$1`
          echo ""
          echo "\t\t\t合计hj"
          echo ""
          echo "\t\t   传票统计完毕,按回车继续...\c"
          read tmp
          ;;
        3)
          if [ -s "dfcp.$1" ]
           then
             sed "s/_/ /g" dfcp.$1 >dfcp.tmp
             mv dfcp.tmp dfcp.$1
             cat dfcp.$1 |pg
           else
             echo ""
             echo "\t\t   无传票录入记录,按回车继续...\c"
             read tmp
           fi
          ;;
        4)
          sed "s/_/ /g;s/ //g" dfcp.$1 >dfcp.tmp
          awk 'BEGIN{ line=65;i=0 }
                    { if ( i == 65 )
                       { printf (" \n";
                        i=0 }
                       else
                       { i=i+1;
                        print $0 }
                    }' dfcp.tmp >dfcp.$1
                  
          echo "\033[5i"
          cat  dfcp.$1
          echo "\033[4i"
          echo ""
          echo "\t\t   传票打印完毕,按回车继续...\c"
          read tmp
          rm dfcp.tmp
          ;;
        5)
          >dfcp.$1
          >jine.$1
          if [ -f dfcp.tmp ]
            then
            rm dfcp.tmp
          fi
          echo ""
          echo "\t\t  传票初始化完毕,按回车继续...\c"
          read tmp
          ;;
        6)
          echo ""
          echo  "\t━━━━━━━━━━━━━━━━━━━━━━━"
          echo "\t\t     城区信用社  90801"
          echo "\t\t     任城  联社  90802"
          echo "\t\t     兖州  联社  90803"
          echo "\t\t     曲阜  联社  90804"
          echo "\t\t     泗水  联社  90805"
          echo "\t\t     邹城  联社  90806"
          echo "\t\t     微山  联社  90807"
          echo "\t\t     鱼台  联社  90808"
          echo "\t\t     金乡  联社  90809"
          echo "\t\t     嘉祥  联社  90810"
          echo "\t\t     汶上  联社  90811"
          echo "\t\t     梁山  联社  90812"
          echo  "\t━━━━━━━━━━━━━━━━━━━━━━━"
          echo ""
          echo "\t\t    查询完毕,按回车继续...\c"
          read tmp
          ;;
        esac
done
      

xx2dx原码如下:/*******************小写转换大写金额程序****************/
#include <stdio.h>
#define TEN     "拾"
#define HND     "佰"
#define THU     "仟"
#define TTH     "万"
#define HMI     "亿"

#define FILL(A)         if(!zflag)  strcat(sResult, A);  break
#define FILLW(A)        if(!zflag)  {  tthflag = 1;  strcat(sResult, A);  }  break

#define FILLY(A)        if(!zflag)  {  hmiflag = 1;  strcat(sResult, A); }  break

void main(int argc, char **argv)
{
        if(argc < 2)
        {
                printf("Usage: %s amt\n", argv[0]);
                               exit(0);
        }
        PrintBigMoney(argv[1]);

        exit(0);
}

int PrintBigMoney(char *source)
{
        char    sResult[300], intpart[30], decpart[20], *pstr;
        char    *BigNum[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        int     i, intlen, p_int = 0, zheadflag = 1, zflag = 0;
        int     tthflag = 0, hmiflag = 0;                                                                                                                     

        memset(sResult, '\0', sizeof(sResult));
        strcpy(intpart, source);

        if (intpart[p_int] == '-')
        {
                strcat(sResult, "负";
                p_int++;
        }

        pstr = (char *)strstr(intpart + p_int, ".";
        if (pstr != NULL)
        {
                pstr[0] = '\0';
                strcpy(decpart, pstr + 1);
        }
        intlen = strlen(intpart);
        for(i = 0; i < intlen; i++)
        {
                if(intpart < '0' || intpart > '9')
                                                                                
                {
                        printf("part of int is not valid\n";
                        exit(0);
                }
        }
        for(i = 0; i < strlen(decpart); i++)
        {
                if(decpart < '0' || decpart > '9')
                {
                        printf("part of dec is not valid\n";
                        exit(0);
                }
        }
        if(intlen > 12)
                printf("Warning: number is too large to translate, result is possibly not accuracy!\n";
        if(atol(intpart) == 0)
                strcat(sResult, BigNum[0]);
        for (i = p_int; i < intlen; i++)
        {
                if (intpart == '0')                                          
                {
                        if(zheadflag)
                                continue;
                        else
                                zflag = 1;
                }
                else
                {
                        zheadflag = 0;
                        if(zflag)
                        {
                                strcat(sResult, BigNum[0]);
                                zflag = 0;
                        }
                        strcat(sResult, BigNum[intpart - '0']);
                }
                switch(intlen - i)
                {
                case 2:
                        FILL(TEN);
                case 6:
                                                                                
                        FILLW(TEN);
                case 10:
                        FILLY(TEN);
                case 14:
                        FILLW(TEN);
                case 18:
                        FILLY(TEN);
                case 3:
                        FILL(HND);
                case 7:
                        FILLW(HND);
                case 11:
                        FILLY(HND);
                case 15:
                        FILLW(HND);
                case 19:
                        FILLY(HND);
                case 4:
                        FILL(THU);
                case 8:
                        FILLW(THU);
                case 12:
                        FILLY(THU);
                case 16:
                        FILLW(THU);
                case 20:
                        FILLY(THU);
                case 5:
                case 13:
                        if(!zflag)
                                strcat(sResult, TTH);
                        else
                        {
                                if(tthflag)
                                        strcat(sResult, TTH);
                        }
                        break;
                case 9:
                        tthflag = 0;
                case 17:
                                strcat(sResult, HMI);
                        break;                                                  
                }
        }
        strcat(sResult, "元";
        if ((strlen(decpart) != 0) && (atol(decpart) != 0))
        {
                for (i = 0; i < strlen(decpart); i++)
                {
                        if (decpart >= '0' && decpart <= '9')
                                strcat(sResult, BigNum[decpart - '0']);
                        if (i == 0)
                                strcat(sResult, "角";
                        if (i == 1)
                                strcat(sResult, "分";
                }
        }
        else
                strcat(sResult, "整";
        printf("%s\n", sResult);
}

论坛徽章:
0
2 [报告]
发表于 2004-06-23 14:08 |只看该作者

传票录入for Sco5.05(求助:请帮我优化一下程序)

我都等了很长时间了,怎么没人回复啊?郁闷中。。。。。。。。。

论坛徽章:
0
3 [报告]
发表于 2004-06-23 14:51 |只看该作者

传票录入for Sco5.05(求助:请帮我优化一下程序)

谢谢你的大小写转换,我有用,呵呵,但在这里只会有人回答一些简短的问题!

论坛徽章:
0
4 [报告]
发表于 2004-06-23 15:03 |只看该作者

传票录入for Sco5.05(求助:请帮我优化一下程序)

”取大写、小写字符串长度时速度很慢,请帮我优化一下“
把这两个地方举个例子。这么长的代码我看的都头大了。

论坛徽章:
0
5 [报告]
发表于 2004-06-23 15:50 |只看该作者

传票录入for Sco5.05(求助:请帮我优化一下程序)

echo "┣━┻┳━━┻━━━━━┻━━┻━━━━━┻━┻━━━┻━━┻━━┻━━┫件" >>dfcp.$1
echo "┃金额┃大写dxjine$jine┃" >>dfcp.$1
echo "┣━━┻━━━┳━━━━━┳━━━┳━━━━┳━━━━━━━━━━━━━┫" >>dfcp.$1

取大小写主要用在在金额栏目,固定长度,谁能有好的方式解决此问题,我的这段代码速度太慢了,影响键盘输入。

论坛徽章:
0
6 [报告]
发表于 2004-08-20 16:53 |只看该作者

传票录入for Sco5.05(求助:请帮我优化一下程序)


  1. 为了达到定长数据,你采用了while循环左补空格,如果是C里面实现,会很快
  2. 但是shell中,循环是最影响效率的因素

  3. 假定你需要的固定的宽度是13

  4. #如果val超过了13位,只取13位
  5. tmp=$(printf "%.13s", "${val}")
  6. #如果tmp不足13位,则左不全空格到13位
  7. val=$(printf "%13s", "${tmp}")

  8. val就是能满足你要求的数据了
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-07-21 23:04 |只看该作者
楼主能不能帮我写一个,我也需要这个啊,我要一个全部是shell脚本的,谢谢了
wayy2008 该用户已被删除
8 [报告]
发表于 2006-07-22 10:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2006-07-23 12:59 |只看该作者
可以直接添加你需要长度的字符在cut不就可以了
如a=123
需要固定长度10
b=`echo $a"__________"|cut -c 1-10`
这是添加在后面
前面也可。
echo $a"__________"|cut -c 1-10|sed 's/\([^_]*\)\(_\+\)/\2\1/'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP