Arquivo sequencial e arquivo linear sequencial

Um pouco de conceito…

Arquivos declarados com ORGANIZATION IS SEQUENCIAL são formados por registros sem delimitadores explícitos de fim de registro. Os registros nesse tipo de arquivo são “delimitados” apenas pelo offset que é calculado a partir do tamanho do registro.

Já arquivos declarados com ORGANIZATION IS LINE SEQUENTIAL possuem um delimitador explícito ao final de cada registro, que pode ser o caracter x’0A’ (ASCII 10, também chamado de LF) em plataforma Linux ou a combinação x’0D0A’ (ASCIIs 13 e 10, também conhecidos como CR/LF) em plataforma Windows.

Na prática…

Vamos codificar um programa simples apenas para gerar, inicialmente, um arquivo sequencial e ver como ele se parecerá no Linux:

identification division.
program-id. gtc007.

environment division.
input-output section.
file-control.

    select arquivo assign to "arquivo.seq"
    organization is sequential.

data division.
file section.
fd arquivo.
01 registro pic x(010).

procedure division.
inicio.

    open output arquivo

    move all "1" to registro
    write registro

    move all "2" to registro
    write registro
    
    move all "3" to registro
    write registro
    
    close arquivo.

    stop run.

Na verdade a cláusula ORGANIZATION IS SEQUENTIAL não seria necessária, uma vez que é a organização default para o COBOL. Só a colocamos aqui para destacar que vamos gerar um arquivo desse tipo.

Ao executar o programa e listar o arquivo gerado, o que vemos é o seguinte:

[aeisxpad ~/cbl]$ cat arquivo.seq
111111111122222222223333333333
[aeisxpad ~/cbl]$

Repare que os três registros aparecem um ao lado do outro como se fossem uma única string. Um programa COBOL que leia esse arquivo recuperará cada registro calculando um offset com base no tamanho de registro que foi declarado na FD. Nesse exemplo o tamanho do registro é 10.

Agora vamos ver o que aconteceria se alterássemos a organização para linear sequencial. Para isso só precisamos fazer uma modificação no parágrafo FILE-CONTROL:

environment division.
input-output section.
file-control.
    select arquivo assign to "arquivo.seq"
    organization is line sequential.

Ao reexecutar o programa e listar o arquivo, o que vemos agora é o seguinte:

[aeisxpad ~/cbl]$ cat arquivo.seq
1111111111
2222222222
3333333333
[aeisxpad ~/cbl]$

Agora parece que um registro está embaixo do outro. Isso acontece porque há um delimitador (aqui invisível) no final de cada registro.

Para ver esse delimitador, podemos usar um editor que exiba o conteúdo hexadecimal do arquivo:

vim arquivo.seq
:%!xxd

Aqui vemos 10 bytes preenchidos com x’31’ (correspondente ao caracter “1”), seguido de um delimitador x’0a’ (o LF), seguido de mais 10 bytes x’32’ (caracter “2”), outro LF, mais 10 bytes x’33’ (caracter “3”) e mais um LF final.

Conclusão

A diferença entre esses dois tipos de organização é sutil, mas possui implicações importantes quando decidimos por um ou por outro.

Como arquivos sequenciais não possuem delimitadores, são ideais quando precisamos de arquivos planos que possuem tanto campos USAGE DISPLAY, quanto campos USAGE COMP-1, COMP-2, COMP-3 etc.

Já um arquivo linear sequencial não deve possuir campos USAGE COMP-* uma vez que um eventual byte x’0A’ (ou uma eventual combinação x’0D0A’ no Windows) será incorretamente interpretada pelo sistema operacional.

Além disso, quando precisamos gerar o arquivo numa plataforma (digamos, Linux) e enviá-lo para outra plataforma (Windows, por exemplo) o ideal é que esse arquivo seja linear sequencial, principalmente quando os “consumidores” desse arquivo na plataforma de destino esperarem que o arquivo tenha delimitadores. Um exemplo típico seria um arquivo csv gerado por um programa COBOL no Linux e que seja transferido para o Windows para que um Excel possa carregá-lo.


Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *