我正在创建一个SSIS包,以便从一系列copybook文件中读取未打包的数据。我不确定对以下字段定义的正确解释,希望有人知道:
字段名称-1 PIC S9(15)V9(3)组件-3。
字段名称-2 PIC S9(3)V9(8)组件-3。
字段名称-3 PIC S9(3)V9(6) COMP-3。
数据存储在固定宽度的文本中。以上字段的数据长度如下:
FIELD-NAME-1: 19 FIELD-NAME-2: 11 FIELD-NAME-3: 9
我不知道如何解释小数位和符号。
任何帮助都将不胜感激。
亲切的问候,哈姆
发布于 2009-04-28 19:32:31
这里有一些不同的尝试来回答你的问题。
PIC S9(15)V9(3) COMP-3在文件中如下所示:
00 00 00 00 00 00 00 00 00 0F如果值为-4568248.323,则为:
00 00 00 00 04 56 82 48 32 3D这对你没有帮助,但可能会帮助其他人。解压之前的值将如下所示:
F0 F0 F0 F0 F0 F0 F0 F0 F0 F4 F5 F6 F8 F2 F4 F8 F3 F2 D3 (or F3 as the last byte, therefore losing the sign)此字段在小数点前有15位(实际上是16位),小数点后有3位。
虽然它只需要18位数字(15+3),但它会得到19,以使其成为带有符号的偶数长度字段(在文件中,将一个数字添加到前面,使其成为10字节长)。最佳实践是始终将压缩字段设置为奇数长度,以避免这种混淆。
**最后一个字母表示符号,C&F为正,D为负。对于您的程序,检查是否为阴性(D),如果不是,则将其视为阳性。
**“V”是隐含的小数点。它不存在于文件中,但是COBOL知道它在那里是为了取整之类的。您需要以编程方式对其进行说明。文件中没有任何东西可以帮助您确定它在哪里,或者它是否存在。
另外两个字段已经是奇数长度了,所以当与符号一起打包时,它们可以存储在偶数长度的空间量中。
任何其他问题,请在评论中编辑您的问题或提问,其他人将尝试为您回答它们。
发布于 2009-04-30 01:32:45
请参见http://jrecord.cvs.sourceforge.net/viewvc/jrecord/jrecord/src/net/sf/JRecord/Common/Conversion.java?revision=1.2&view=markup中的方法getMainframePackedDecimal
在java中转换压缩十进制的示例(它是jrecord项目jrecord.sf.net的一部分)
发布于 2009-04-27 22:40:16
我们开始吧:
图片就是“图片”
S9( 15 )表示15位数字有符号字段:S表示符号,9表示数字,(15)表示长度。V是小数位9(3)是一个三位数字
COMP-3是BCD编码的十进制。该字段的每个非零字节(半字节)都是一个二进制值,因此
0b01110110 (duh)
是"76“。
18位需要9个字节,符号是低位字节的低位字节。
这让我担心,那些应该需要10字节的。
这是一个nice article on it。
https://stackoverflow.com/questions/795523
复制相似问题