Java recebe do Cobol
Começou que o Sistema em Java gravava informações vinda do Cobol no log e para entender melhor tive que pensar em um particionador para ler estas informações.
Como funciona?
Através do CTG o Java se comunica com o COBOL/CICS, assim conseguimos executar programas do Mainframe. O seu retorno nada mais é que uma grande string, fazendo com que só quem tem a book do programa sabe qual posição de cada campo. Para quem não entendeu vamos para um exemplo bem simples:
“Quando recuperamos, temos que fazer um substring em cada item para saber o valor correto, assim poderemos ler e utilizar a informação”
- Imagina que chamemos um serviço que devolve em uma string o valor “000ESCOVADOR1TESTE”;
- Se tivermos a Book do programa que informa a posição de cada campo, seria mais ou menos desta forma:
- CODIGO 3
- NOME 9
- TIPO 1
- DESCRICAO 5
- Então nosso resultado com Book + valores seria:
- CODIGO : 000
- NOME : ESCOVADOR
- TIPO : 1
- DESCRICAO : TESTE
Meu desafio
Na verdade a explicação acima só foi um exemplo bem simples mas meu desafio seria um pouco diferente, recebia no log do Java uma tripa em forma de texto, mais ou menos 53Kb de tamanho, que seria 53000 caracteres, tive é claro que usar a Book do cobol para saber cada campo, senão seria muito difícil entender os dados, esta Book tem quase 900 campos. Então pensei, vou precisar de um arquivo de layout (a minha Book), arquivo de entrada e fazer um arquivo de saida, simples! Coloquei o layout em CSV para facilitar qualquer edição no Excel, a entrada com a tripa do cobol deixei em txt e o resultado também salvei em CSV para facilitar a leitura do resultado. Como eu não sou uma pessoa muito organizada, tive que reprogramar este código várias vezes, em outras linguagens (Java e PHP), agora resolvi escreve-lo em Python, doideira!
Agora o código
Segue meu código 😉
entrada = open(‘entrada.txt’,’r’).read()
file = open(‘layout.csv’,’r’)
atual = 0
descricao = “”;
for linha in file.read().splitlines():
coluna = linha.split(‘;’)
if coluna != None:
valor = entrada[atual:atual+int(coluna[1])]
atual += int(coluna[1])
descricao += coluna[0] + “;” + str(valor) + “\n”
resultado = open(‘resultado.csv’,’w’)
resultado.write(descricao)
resultado.close()