帮我读一下大型机的ANSI文件摘录

时间:2011-03-08 17:41:59

标签: java ansi mainframe

http://www.2shared.com/document/VqlJ-1wF/test.html

1)这个文件编码的编码是什么? 2)在Java中阅读本文的最佳方法是什么?

目前我有

Scanner scanner = new Scanner(new File("test.txt"), "IBM850");
while (scanner.hasNextLine()) {
buffer = new StringBuffer(scanner.nextLine());
System.out.println("BUFFER = "+buffer.toString());
}

打印很多空值和垃圾。什么是我需要使用的正确编码?

5 个答案:

答案 0 :(得分:2)

我在PC和IBM中端系统之间移动数据方面拥有丰富的经验。我可以说这个文件肯定是不是(纯)EBCDIC。每个“行”的开头是 ASCII 字符:

CODE12312345678901502G830918

任何EBCDIC字符匹配该序列的可能性,从不介意所有三条线上的相同序列是无穷小。

我最好的选择是使用二进制数据的ASCII导入(或已经翻译过的EBCDIC)。如果它被翻译,二进制部分几乎肯定已被破坏。

我用十六进制检查后不久可能会有更多信息。

每个“记录”用十六进制0D 0A 0D 0A分隔,它们是一对CRLF序列。

我认为你很可能有一个固定的字段平面文件格式,其中的文本字段为ASCII,其他字段为二进制。

答案 1 :(得分:1)

通常,IBM大型机数据存储在character encodings的区域风格中,如美国的Cp437或多语言Cp870。

答案 2 :(得分:1)

它绝对不是EBCDIC编码的(我花了70年代和80年代在IBM大型机上工作,所以我认识到EBCDIC :-)。它似乎是带有一些二进制组件的ASCII。正确解释这一点的唯一方法是让提供程序为您提供描述每种记录类型(可能有一个或多个)的映射,并指示嵌入式二进制对象的数据类型。

答案 3 :(得分:1)

从它的外观来看,你已经采用了二进制大型机文件,并在将其传输到PC时对其进行了ascii转换。这不起作用。

为了说明出现问题,考虑一个值为64(X'0040')的2字节二进制整数字段,这将被转换为32(x'0020')因为x'40'也是空格字符的EBCIDIC ; ascii转换器将所有EBCIDIC空间转换为ascii空格(x'20')。你真的想要二元和Packed-Decimal字段。

您有两个选择:

  1. 将所有Comp3 /二进制字段转换为大型机上的文本(Cobol / sort / easytrieve等可以执行此操作)。然后进行转移
  2. 二进制传输到PC 并编写程序来读取文件。 java包JRecord(http://jrecord.sourceforge.net/)可以读写大型机文件
  3. 进行二进制传输并使用类似的实用程序 RecordEditor (http://record-editor.sourceforge.net/Record04.htm) 阅读它。 recordEditor可以 读取大型机文件并将其另存为 CSV或固定宽度的ascii文件。 RecordEditor 可以使用Cobol 用于查看文件的Copybook。
  4. 我可以告诉你的是,主机上的文件长度为2000字节,包含很多Packed-Decimal字段(Cobol Comp-3)。

    我已经解码了第一条记录的前120个字节:

    Field     start     length   Value                    Hex Representation
    n0        1         4        CODE                     434f4445        
    n1        5         17       12312345678901502        3132333132333435363738393031353032       
    n2        22        1        G                        47        
    n3        23        6        830918                   383330393138        
    n4        29        1        V                        56        
    n5        30        3        2470                     02470f        
    n6        33        4        0                        0000000f        
    n7        37        3        2470                     02470f        
    n8        40        2        09                       3039        
    n9        42        5        290502                   000290502c        
    n10       47        5        10842                    000010842c        
    n11       52        5        279660                   000279660c        
    n12       57        5        19072                    000019072c        
    n13       62        5        11488                    000011488c        
    n14       67        5        0                        000000000c        
    n15       72        4        0                        0000000c        
    n16       76        4        0                        0000000c        
    n17       80        7        439914                   0000000439914c        
    n18       87        7        0                        0000000000000c        
    n19       94        7        0                        0000000000000c        
    n20       101       4        7588                     0007588c        
    n21       105       4        7588                     0007588c        
    n22       109       4        0                        0000000c        
    n23       113       4        0                        0000000c        
    n24       117       5        0                        000000000c        
    
    Where: 
    Start  - Field start (byte number)
    length - Field length (in bytes)
    Value  - Field value
    Hex representation - How the field is stored in the file in hex
    

答案 4 :(得分:0)

使用cp1047字符集,如下所示。

BufferedReader br =新的BufferedReader(新的InputStreamReader(InputStream,“ cp1047”));