Para leer el archivo COBOL-genned, necesitará saber:
En primer lugar, usted necesitará el registro diseño (cuaderno) para el archivo. Un diseño de registro COBOL se verá algo como esto:
01 PATIENT-TREATMENTS.
05 PATIENT-NAME PIC X(30).
05 PATIENT-SS-NUMBER PIC 9(9).
05 NUMBER-OF-TREATMENTS PIC 99 COMP-3.
05 TREATMENT-HISTORY OCCURS 0 TO 50 TIMES
DEPENDING ON NUMBER-OF-TREATMENTS
INDEXED BY TREATMENT-POINTER.
10 TREATMENT-DATE.
15 TREATMENT-DAY PIC 99.
15 TREATMENT-MONTH PIC 99.
15 TREATMENT-YEAR PIC 9(4).
10 TREATING-PHYSICIAN PIC X(30).
10 TREATMENT-CODE PIC 99.
También necesitará una copia de IBM Principios de funcionamiento (S/360, S370, z/OS, en realidad no importa para nuestros propósitos) Última está disponible en IBM en
los capítulos 8 (Instrucciones decimales) y 9 (Floating Point general e instrucciones de apoyo) son los bits interesantes para nuestros propósitos.
Sin eso, que está bastante perdido.
Luego, debe comprender los tipos de datos COBOL. Por ejemplo:
- PIC define un campo con formato alfanumérico (PIC 9 (4), por ejemplo, 4 dígitos decimales, que podría rellenarse con caracteres de espacio si falta). La imagen 999V99 tiene 5 dígitos decimales, con un punto decimal implícito. Continuamente y así forthe.
- BINARY es [normalmente] un entero binario con punto fijo firmado. Los tamaños habituales son halfword (2 octets) y fullword (4 octets).
- COMP-1 es punto flotante de precisión simple.
- COMP-2 es punto flotante de doble precisión.
Si el origen de datos es un mainframe de IBM, COMP-1 y COMP-2 probablemente no será punto flotante EEI: será de IBM base-16 excess 64 floating point format. Necesitará algo como S/370 Principios de operación para ayudarlo a comprenderlo.
- COMP-3 es 'packed decimal', de longitudes variables. El decimal empaquetado es una forma compacta de representar un número decimal. La declaración tendrá el siguiente aspecto:
PIC S9999V99 COMP-3
. Esto dice que está firmado, consta de 6 dígitos decimales con un punto decimal implícito. El decimal empaquetado representa cada dígito decimal como un mordisco de un octeto (valores hexadecimales 0-9). El dígito de orden superior es el nibble superior del octeto más a la izquierda. El nibble bajo del octeto más a la derecha es un valor hexadecimal A-F que representa el signo. Por lo tanto, la cláusula PIC
anterior requerirá ceil((6+1)/2)
o 4 octetos. el valor -345.67, como se representa por la cláusula PIC
anterior se verá como 0x0034567D
. El valor del signo real puede variar (el valor predeterminado es C/positivo, D/negativo, pero A, C, E y F se tratan como positivos, mientras que solo B y D se tratan como negativos). Nuevamente, vea S \ 370 Principles of Operation para detalles sobre la representación.
Relacionado con COMP-3 es zonado decimal. Esto podría declararse como `PIC S9999V99 '(firmado, 5 dígitos decimales, con un punto decimal implícito). Los dígitos decimales, en EBCDIC, son los valores hexadecimales 0xFO - 0xF9. 'Unpack' (instrucción de máquina de mainframe) toma un campo decimal empaquetado y lo convierte en un campo de caracteres. El proceso es:
- comienzan con el octeto del extremo derecho. Inviértalo, para que el signo de mordisco esté en la parte superior y colóquelo en el octeto más a la derecha del campo de destino.
Trabajando de derecha a izquierda (fuente y destino ambos), quite cada mordisco restante del campo decimal empaquetado y colóquelo en el nibble bajo del siguiente octeto disponible en el destino. Llene el nibble alto con un hex. F.
La operación finaliza cuando se agota el campo de origen o de destino.
Si el campo de destino no está agotado, si se rellenó con ceros rellenando los octetos restantes con el decimal '0' (oxF0).
Así que nuestro valor ejemplo, -345,67, si se almacena con el valor del signo por defecto (hex D), obtendría desembalado como 0xF0F0F0F3F4F5F6D7 ('0003456P', en EBDIC).
[Aquí tienes. Hay un cuestionario más adelante]
- Si la aplicación COBOL vive en un mainframe de IBM, ¿se ha convertido el archivo de su EBCDIC original a ASCII? De lo contrario, tendrá que hacer el mapeo usted mismo (Sugerencia: no es necesariamente tan sencillo como podría parecer, ya que esto podría ser un proceso selectivo, solo los campos de caracteres se convierten (COMP-1, COMP-2, COMP) -3 y BINARY quedan excluidos ya que son una secuencia de octetos binarios).Peor aún, hay múltiples sabores de representaciones EBCDIC, debido a las variadas implementaciones nacionales y las diferentes cadenas de impresión en uso en diferentes impresoras.
Oh ... una última cosa. El hardware del mainframe tiende a gustar diferentes elementos alineados en los límites de media palabra, palabra o palabra doble, por lo que el diseño del registro puede no corresponderse directamente con los octetos del archivo, ya que puede haber octetos de relleno insertados entre campos para mantener la alineación de palabras necesaria.
Buena suerte.
Necesita averiguar el proveedor del COBOL, luego descubra cuál es el formato del archivo. No hay un solo formato "COBOL". –
Sería interesante saber qué formato * supone * ser, ¿es un CSV? ¿Puedes hablar con el tipo que genera el archivo para preguntarle qué debe contener el archivo? –
COBOL es anterior a CSV. –