gpt4 book ai didi

c# - 已签名的超值的解析器?

转载 作者:太空狗 更新时间:2023-10-29 22:12:01 24 4
gpt4 key购买 nike

我正在处理一些旧数据导入,并从一个外部来源中发现了一堆数据,这些数据报告了带有 signed overpunch 的财务数字。 .我见过很多,但这是在我的时代之前。在我着手创建一个函数来解析这些陌生人之前,我想检查一下是否有一种标准的方法来处理这些陌生人。

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

最佳答案

Over-punched numeric(Cobol 中的Zoned-Decimal)来自旧式打洞卡片,他们在数字的最后一位数字上过度打洞。该格式在 Cobol 中很常用。

因为有 AsciiEbcdic Cobol 编译器,所以有 AsciiEBCDIC 版本分区数字。更复杂的是,US-Ebcdic (IBM037) 的 -0 和 +0 值({})对于德国-Ebcdic(IBM273 它们是 äü),在其他 Ebcdic 语言版本中又有所不同。

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

  • 数据是否源自 Ebcdic 或 Ascii 系统
  • 如果是 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 Zoned,这是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 和一些开源包可以处理大型机 Cobol 数据。

关于c# - 已签名的超值的解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com