A instrução UNSTRING no COBOL separa partes de uma string (campo de envio) em campos menores (campos de recepção), usando delimitadores definidos. É útil para extrair informações contidas em uma única variável com conteúdo estruturado.

📌 Para que serve

  • Separar dados contíguos em substrings.

  • Distribuir os pedaços da string original em múltiplos campos.

  • Substituir múltiplas instruções MOVE.

  • Extrair dados com base em delimitadores (como espaço, vírgula, barra, etc.).

🧾 Sintaxe básica

UNSTRING campo-fonte
   DELIMITED BY delimitador
   INTO campo-1 DELIMITER IN delimitador-1 COUNT IN contador-1
        campo-2 DELIMITER IN delimitador-2 COUNT IN contador-2
   WITH POINTER ponteiro
   TALLYING IN total-campos
   ON OVERFLOW DISPLAY "Erro de estouro"
   NOT ON OVERFLOW DISPLAY "Separação realizada com sucesso"
END-UNSTRING.

✅ Exemplo prático

01 TEXTO-COMPLETO     PIC X(30) VALUE "JOSE,ROBERTO,SANTOS".
01 NOME               PIC X(10).
01 SOBRENOME          PIC X(10).
01 ULTIMO-NOME        PIC X(10).
01 PONTEIRO           PIC 9(02) VALUE 1.

UNSTRING TEXTO-COMPLETO
   DELIMITED BY ","
   INTO NOME, SOBRENOME, ULTIMO-NOME
   WITH POINTER PONTEIRO
END-UNSTRING.

DISPLAY "Nome: ", NOME.
DISPLAY "Sobrenome: ", SOBRENOME.
DISPLAY "Último nome: ", ULTIMO-NOME.

📝 Saída esperada:

Nome: JOSE
Sobrenome: ROBERTO
Último nome: SANTOS

⚙️ Como funciona internamente

  • A variável de origem é percorrida da esquerda para a direita.

  • Ao encontrar um delimitador, o conteúdo até esse ponto é copiado para o campo de recepção.

  • O delimitador pode ser armazenado e a quantidade de caracteres pode ser contabilizada.

  • O ponteiro pode ser usado para controlar de onde começa a próxima leitura.

  • É possível capturar todos os delimitadores com ALL ou considerar apenas um de cada vez.

⚠️ Regras importantes

  • O campo de origem (identifier-1) deve ser alfanumérico, DBCS ou nacional.

  • Campos numéricos de recepção devem ter USAGE DISPLAY ou NATIONAL, sem símbolo P.

  • Quando há DELIMITED BY ALL, múltiplos delimitadores contíguos são tratados como um só.

  • O uso de POINTER, COUNT IN e DELIMITER IN é opcional, mas oferece mais controle e rastreabilidade.

  • Ao usar TALLYING IN, você sabe quantos campos foram preenchidos.

  • Um delimitador com dois ou mais caracteres só é reconhecido se estiver exatamente igual e na ordem no campo de origem.

🧠 Dicas práticas

  • Ideal para processar strings CSV ou campos concatenados.

  • Inicialize o ponteiro e o tally antes da execução para evitar comportamentos imprevisíveis.

  • Combine com INSPECT para verificar a presença de delimitadores antes do UNSTRING.

  • Sempre trate possíveis estouros com ON OVERFLOW para maior segurança.

 

✅ Conclusão

A instrução UNSTRING é extremamente útil para separar dados estruturados contidos em uma única string, simplificando o código e aumentando a legibilidade. É uma ferramenta poderosa, especialmente em programas que lidam com entradas concatenadas, arquivos texto, ou campos compostos vindos de sistemas externos.