Помогите мне прочитать этот извлечение файла ANSI из мэйнфрейма - PullRequest
2 голосов
/ 08 марта 2011

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 ]

2 голосов
/ 08 марта 2011

У меня большой опыт перемещения данных между ПК и системами среднего класса IBM.Я могу сказать, что файл определенно не (чистый) EBCDIC.В начале каждой «строки» находятся ASCII символы:

CODE12312345678901502G830918

Вероятность того, что любые символы EBCDIC соответствуют этой последовательности, не говоря уже о одинаковой последовательности во всех трех строках, бесконечно мала.

Моя лучшая ставка была бы на вывод ASCII (или уже переведенный EBCDIC) с двоичными данными.Если он был переведен, двоичная часть почти наверняка повреждена.

У меня может быть больше информации вскоре после того, как я изучу его в шестнадцатеричном формате.

Каждая «запись» отделена шестнадцатеричным 0D 0A 0D 0A, который представляет собой пару последовательностей CRLF.

Я думаю, что вы, скорее всего, имеете фиксированный формат плоского файла с текстовыми полями в ASCII и другим полем в двоичном формате.

1 голос
/ 12 марта 2011

Судя по всему, вы взяли двоичный файл мэйнфрейма и сделали преобразование ascii для него при передаче его на ПК. Это не будет работать.

Чтобы проиллюстрировать, что идет не так, рассмотрим 2-байтовое двоичное целочисленное поле со значением 64 (X'0040 '), которое будет преобразовано в 32 (x'0020'), поскольку x'40 'также является EBCIDIC для пробела ; Конвертер ascii преобразует все пространства EBCIDIC в пространства ascii (x’20 ’). Вы действительно хотите, чтобы двоичные поля и поля упакованного десятичного числа остались одни.

У вас есть 2 варианта:

  1. Преобразование всех полей Comp3 / двоичных файлов в текст на мэйнфрейме (Cobol / sort / easytrieve и т. Д. Могут это сделать). Затем сделайте перевод
  2. Сделать бинарный перевод на ПК и либо напишите программу для чтения файла. Пакет java JRecord (http://jrecord.sourceforge.net/) может читать и записывать файлы мэйнфреймов
  3. Выполните двоичную передачу и используйте утилиту наподобие RecordEditor (http://record -editor.sourceforge.net / Record04.htm ) читать это. RecordEditor может прочитать файл мэйнфрейма и сохранить его как CSV или Ascii файлы с фиксированной шириной. RecordEditor можно использовать кобол Тетрадь для просмотра файла.

Что я могу вам сказать, так это то, что файл длиной 2000 байт на мэйнфрейме содержит много полей упакованного десятичного числа (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
1 голос
/ 08 марта 2011

Это определенно НЕ кодируется EBCDIC (70-е и 80-е годы я работал на мэйнфреймах IBM, поэтому я узнаю EBCDIC :-)Похоже, что это ASCII с некоторыми бинарными компонентами.Единственный способ правильно интерпретировать это - предоставить поставщику сопоставление, описывающее каждый тип записи (может быть один или несколько) и указывающее типы данных встроенных двоичных объектов.

1 голос
/ 08 марта 2011

Обычно данные мэйнфреймов IBM хранятся в одном из региональных вариантов кодировки символов , например Cp437 в США или многоязычном Cp870.

0 голосов
/ 28 августа 2018

используйте кодировку cp1047, как показано ниже.

BufferedReader br = новый BufferedReader (новый InputStreamReader (InputStream, "cp1047"));

...