我正在处理一些旧的数据导入,并从外部资源中发现了一堆数据,这些数据以signed overpunch报告财务数字。我看过很多,但这是我的时间。在开始创建函数来解析这些陌生人之前,我想检查一下是否存在处理这些陌生人的标准方法。

我想我的问题是,.Net框架是否提供了用于转换带符号的打洞字符串的标准工具?如果不是.NET,我可以使用任何第三方工具,这样我就不会重新发明轮子了吗?

最佳答案

打洞过的数字(在Cobol中为分区小数)来自旧打洞的卡,它们在数字的最后一位数字上对符号进行过打洞。该格式是Cobol中常用的格式。

由于既有 Ascii Ebcdic Cobol 编译器,也有Zoned-Numeric的 Ascii EBCDIC 版本。更复杂的是,-0和+0值(例如US-Ebcdic的 {} ( IBM037 ))与德语-Ebcdic的值不同( IBM273 ,其中äü)又不同其他Ebcdic语言版本)。

要成功处理,您需要知道:

  • 数据是否起源于Ebcdic或Ascii系统
  • if Ebcdic-美国,德语等哪种语言

  • 如果数据在原始字符集中,则可以通过以下方式计算符号:

    对于EBCDIC,数字十六进制代码为:
    Digit          0     1     2   ..    9
    
    unsigned:   x'F0' x'F1' x'F2'  .. x'F9'     012 .. 9
    Negative:   x'D0' x'D1' x'D2'  .. x'D9'     }JK .. R
    Positive:   x'C0' x'C1' x'C2'  .. x'C9'     {AB .. I
    

    对于 US-Ebcdic Zoned,这是用于转换字符串的Java代码:
    int positiveDiff = 'A' - '1';
    int negativeDiff = 'J' - '1';
    
    lastChar = ret.substring(ret.length() - 1).toUpperCase().charAt(0);
    
        switch (lastChar) {
            case '}' : sign = "-";
            case '{' :
                lastChar = '0';
            break;
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
                lastChar = (char) (lastChar - positiveDiff);
            break;
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
                sign = "-";
                lastChar = (char) (lastChar - negativeDiff);
            default:
        }
        ret = sign + ret.substring(0, ret.length() - 1) + lastChar;
    

    对于德语EBCDIC {}变为äü,对于其他EBCDIC语言,您需要查找适当的编码页面。

    对于 Ascii 分区,这是Java代码
        int positiveFjDiff = '@' - '0';
        int negativeFjDiff = 'P' - '0';
    
        lastChar = ret.substring(ret.length() - 1).toUpperCase().charAt(0);
    
        switch (lastChar) {
            case '@':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
                lastChar = (char) (lastChar - positiveFjDiff);
            break;
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
                sign = "-";
                lastChar = (char) (lastChar - negativeFjDiff);
            default:
        }
        ret = sign + ret.substring(0, ret.length() - 1) + lastChar;
    

    最后,如果您在EBCDIC工作,您可以像这样计算
    sign = '+'
    if (last_digit & x'F0' == x'D0') {
       sign = '-'
    }
    last_digit = last_digit | x'F0'
    

    最后一个问题是小数点而不是存储在分区的十进制小数中,它们是假定的。您需要查看Cobol-Copybook。

    例如
     if the cobol Copybook is
    
        03 fld                 pic s99999.
    
     123 is stored as     0012C (EBCDIC source)
    
     but if the copybook is (v stands for assumed decimal point)
    
       03 fld                  pic s999v99.
    
     then 123 is stored as 1230{
    

    最好在Cobol中进行翻译!!!或使用Cobol翻译包。

    有几种用于处理Cobol数据的商业软件包,它们往往很昂贵。
    有一些Java是一些可以处理Mainframe Cobol Data的开源软件包。

    09-17 13:39