Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Crear Rutina que exporte archivos DAT a TXT?


KalEl
21 de septiembre de 2017, 19:41
Que tal amigos, soy muy nuevo en cobol, pero lo único que necesito es crear un pequeño programa que exporte la información de los archivos .dat a txt, con los respectivos nombres de columna.

Tengo los archivos CPY y FD, que creo son necesarios para poder hacer la exportación.
El fin de todo esto es poder tomar la información para trabajarla con sistemas de Business Intelligence.

Como puedo empezar a hacerlo? Alguien tiene alguna rutina de ejemplo?

Desde ya muchas gracias.

Josber
21 de septiembre de 2017, 20:26
KalEl, No hay rutinas ya hechas para eso, es muy sencillo de hacer, abres el fichero origen para lectura, (OPEN INPUT fichero_origen), el de destino para escritura, (como tiene que ser un fichero LINE SEQUENTIAL, has de abrirlo con OPEN EXTEND fichero_destino), y después, te posicionas en el fichero_origen con un START, lo lees de manera secuencial con un READ NEXT, montas en una variable alfanumérica los campos con un STRING, grabas esa variable en el fichero destino con un WRITE y cuando termines, haces un CLOSE de los dos ficheros y ya lo tienes.

Sólo has de tener en cuenta, si los campos en el fichero destino, son de longitud fija o variable, porque lo que yo te he puesto es para longitud fija.

Si no lo entiendes bien, dilo e intentaremos poner algún ejemplo sencillo.

Un saludo.-

KalEl
21 de septiembre de 2017, 23:39
@Josber, Gracias por responder.
Lo voy a probar.
Te paso un .dat de ejemplo, para ver si me puedes orientar con este y hacer algunas pruebas. Y Así sigo yo con todos los demas. Lo deje adjunto en este mensaje.


Muchas gracias!

Kuk
21 de septiembre de 2017, 23:55
KalEl, es un fichero indexado RMKF, o sea que puede ser perfectamente tratado por PowerCOBOL.

¿Tú lo que quieres es aprender COBOL o simplemente una "herramienta" que te haga la conversión? Si quieres aprender, intenta ir haciendo cosas y te iremos guiando y ayudando. Si es una necesidad puntual, podemos hacerte el programa nosotros.

¿Los ficheros CPY y FD que tienes son los mismos para todos los ficheros o hay juego para cada fichero de datos?

Para poder ver el fichero de datos que has colgado, tienes que pasarnos también esos 2 ficheros CPY y FD que corresponden al mismo.

KalEl
22 de septiembre de 2017, 01:37
No me interesa mucho aprender Cobol, solo necesito poder extraer las información de los ficheros siempre que lo necesite a TXT.
Ya se otros lenguajes como PHP, Basic, JScript, etc. Asíque creo que puedo entender la lógica si logro tener al menos un ejemplo funcional de este tipo de extractores.

Tengo un CPY que es general y los FD son por cada archivo.

Acá los adjunto.

Kuk
22 de septiembre de 2017, 08:34
KalEl, de todos estos ficheros, el único que nos interesa es el FD, que contiene lo siguiente:


FD LOCA.
01 R86.
02 CO86 PIC 9999.
02 DE86 PIC X(25).
02 HS86 PIC 999.


Lo cual quiere decir, que:


Los primeros 4 bytes es númro
Los siguientes 25 bytes es texto
Los siguientes 3 bytes es númro


Siendo tán pequeño, te puede interesar el siguiente programa genérico que extrae los datos: [Información] Visor archivos RM/COBOL modo texto - COBOL Foro (http://cobolforo.es/showthread.php?t=645&p=3159)

Luego según la información que te he dado, puedes formatear el fichero de texto en Excel.

Ya nos cuentas qué tal te ha ido.

KalEl
22 de septiembre de 2017, 13:26
Gracias Kuk, acabo de probar el link que me pasaste al programita genérico, pero no me extrae la información.. Solo me muestra un resumen del archivo que abro, O no lo estoy usando bien jeje.

Al menos no me extrajo la información en ningún lado.

Luego de saber como es la estructura del archivo, como puedo indicarle esto a un script para que me genere un txt?

Kuk
22 de septiembre de 2017, 14:01
KalEl, en cuanto que abras el fichero, en el mismo directorio te aparece un nuevo fichero con el mismo nombre terminando por *.out. Es decir, te generará AR86.DAT.out

Lo he comprobado y extrae bien las primeras 2 columnas, la tercera por lo visto simepre contiene nulos.

KalEl
22 de septiembre de 2017, 15:51
Perfecto, ahora lo que necesitaría es el código de ese programa, ya que necesito pasar unos 15 archivos a txt cada 2 días.
O al menos que ese programa se pueda usar por línea de comando con un .bat digamos y así armarle el script para que pase uno por uno atomaticamente.

Kuk
22 de septiembre de 2017, 17:02
KalEl, entonces este programa no te sirve.

Como has dicho que todos los ficheros tienen el mismo formato, te puedo crear el programa que necesitas. Eso sí, ando un poco mal de tiempo, a ver si este fin de semana te lo puedo hacer.

KalEl
23 de septiembre de 2017, 00:58
Muy amable Kuk, me gustaría tener el código de esta rutina para poder usarla en los demas archivos.

Muchas Gracias!

Kuk
23 de septiembre de 2017, 07:45
KalEl, ¿tú tienes el compilador?

Por cierto, la estructura que has publicado no corresponde con el fichero, porque el fichero según el programa de antes, es de longitud 59 y la estructura 4+25+3=32

KalEl
23 de septiembre de 2017, 21:30
Tienes Razon, encontre otro FD nuevo para ese archivo. Y da 59 el total.

Kuk
24 de septiembre de 2017, 10:14
KalEl, aquí tienes el programa. Lo he probado y funciona. En la salida te crea fichero de texto plano, separando los campos por punto-coma, es decir formato CSV para poder verlo en Excel.

Desde el script CMD/Batch debes pasar los nombres de los ficheros separados por punto-coma:


CONVF001 "fichero.dat;fichero_salida.csv"



IDENTIFICATION DIVISION.
PROGRAM-ID. CONVAR86.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT AR86-FILE
ASSIGN TO ZZZ-AR86
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS RE-CO86
ALTERNATE RECORD RE-DE86 WITH DUPLICATES
FILE STATUS IS SW-FS.

SELECT TXT-FILE
ASSIGN TO ZZZ-TXT
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS SW-FS.

DATA DIVISION.
FILE SECTION.
FD AR86-FILE.
01 RE-AR86.
02 RE-CO86 PIC 9999.
02 RE-DE86 PIC X(25).
02 RE-AMPLI86 PIC X(30).

FD TXT-FILE.
01 RE-TXT PIC X(62). *> campos entrada + los ";"

WORKING-STORAGE SECTION.
01 SW-FS PIC X(2).
88 SW-FS-OK VALUE '00' '02' '05'.
88 SW-FS-EOF VALUE '10'.

01 ZZZ-AR86 PIC X(50).
01 ZZZ-TXT PIC X(50).

01 CNT-1 PIC S9(9) COMP-5.
01 CNT-2 PIC S9(9) COMP-5.

LINKAGE SECTION.
01 CMD-LINE.
05 CMD-LENGTH PIC S9(4) COMP-5.
05 CMD-CONTENT PIC X(100).
PROCEDURE DIVISION USING CMD-LINE.

DECLARATIVES.
ERR SECTION.
USE AFTER ERROR PROCEDURE ON AR86-FILE.
END DECLARATIVES.

IF CMD-LENGTH = 0
DISPLAY "No hay parametros en entrada. EXIT"

GOBACK
END-IF

UNSTRING CMD-CONTENT DELIMITED BY ";"
INTO ZZZ-AR86, ZZZ-TXT

DISPLAY "Fichero AR86: " ZZZ-AR86
DISPLAY "Fichero TXT : " ZZZ-TXT

PERFORM ABRIR-FICHEROS
PERFORM READ-AR86

PERFORM UNTIL SW-FS-EOF
STRING RE-CO86 ";"
RE-DE86 ";"
RE-AMPLI86 ";"
DELIMITED BY SIZE INTO RE-TXT

WRITE RE-TXT

IF SW-FS-OK
ADD 1 TO CNT-2

ELSE
DISPLAY "ERROR WRITE TXT, FS: " SW-FS

GO TO 9999-ABEND
END-IF

PERFORM READ-AR86
END-PERFORM

DISPLAY "Registros leidos AR86 : " CNT-1
DISPLAY "Registros escritos TXT: " CNT-2

CLOSE AR86-FILE, TXT-FILE

DISPLAY "Tratamiento de datos OK"

GOBACK
.

ABRIR-FICHEROS.

OPEN INPUT AR86-FILE

IF NOT SW-FS-OK
DISPLAY "ERROR OPEN AR86, FS: " SW-FS

GOBACK
END-IF

OPEN OUTPUT TXT-FILE

IF NOT SW-FS-OK
DISPLAY "ERROR OPEN TXT, FS: " SW-FS

GOBACK
END-IF
.

READ-AR86.

READ AR86-FILE

IF SW-FS-OK
ADD 1 TO CNT-1

ELSE
IF NOT SW-FS-EOF
DISPLAY "ERROR READ AR86, FS: " SW-FS

GOBACK
END-IF
END-IF
.

9999-ABEND.

DISPLAY "ABEND - exit"

CLOSE AR86-FILE, TXT-FILE

MOVE 8 TO RETURN-CODE

GOBACK
.

KalEl
24 de septiembre de 2017, 22:30
Kuk, muchisimas gracias, al compilarlo estoy recibiendo los siguientes errores:
(seguramente estoy armando mal el proyecto en general)

Create Type Library for compilation...

Create H:\XXX\Red.cob...
Redexcel Redexcel-Opened(-3) : F5DC410305I-W There is no PROCEDURE DIVISION.
STATISTICS: HIGHEST SEVERITY CODE=W

Revise line information into H:\XXX\Red.cob ...
STATISTICS: HIGHEST SEVERITY CODE=I

Compile H:\XXX\Red.cob...
** DIAGNOSTIC MESSAGE ** (REDEXCEL)
Redexcel Redexcel-Opened(145) : JMN1044I-S The program contained within program 'POW-SCRIPTLET1' must end with an end program header. An end program header is assumed.
STATISTICS: HIGHEST SEVERITY CODE=S, PROGRAM UNIT=1

** The build has failed **

Kuk
24 de septiembre de 2017, 22:43
KalEl, este programa no lo tienes que compilar en PowerCOBOL sino en NetCOBOL (Eclipse) porque es un programa Batch.

luisbago
20 de junio de 2022, 16:42
algo parecido para rm/cobol, tengo el fd

JCantero
21 de junio de 2022, 09:13
@luisbago, Si, puedes utilizar el ejemplo anterior (el fuente) lo modificas poniendo tu SELECT y FD para reemplazar (AR86-FILE) por el el tuyo.

Lo compilas en rmcobol y lo ejecutas.

jmeza
21 de junio de 2022, 18:01
KaIEI, este programa ejemplo te puede ayudar, leer un archivo .DAT y lo traspaso a TXT
slds

luisbago
23 de junio de 2022, 18:01
@luisbago, Si, puedes utilizar el ejemplo anterior (el fuente) lo modificas poniendo tu SELECT y FD para reemplazar (AR86-FILE) por el el tuyo.

Lo compilas en rmcobol y lo ejecutas.

Pues no pude, corregí varios errores pero me quedaron 2 y varios warnig, ya no se como corregir. :perdon:

mando cbl, fd.cbl y el lst

JCantero
23 de junio de 2022, 19:09
Te adjunto fichero modificado.

JCantero
23 de junio de 2022, 19:11
Fichero subido

JCantero
23 de junio de 2022, 19:19
Te envio fichero modificado sin errores ni warnings.


Cosas modificadas:

- Los warning no tienen importancia pero te lo he solucionado.

te faltaban palabras reservadas en las deraclaratives,
te faltaba la seccion inicial,
te faltaba un nombre de parrafo inicial
haces displays de campos tipos comp-3 y hay que usar la palabra reservada convert o movelos a variables de edicion.


- En una sentencia string ...... no puedes poner campos computacionales, lo he movido a un campo de edicion
- tenias varios comentarios. Si no usas directivas de compilacion los comentarios deben de empezar con un * en la columna 7 o posicionar el comentario a partir de la columana 73.

Bueno, ahi lo tienes pruebalo y ya nos dices......

luisbago
28 de junio de 2022, 19:45
runcobol.exe idx2cvs 211.idx;cosa.txt
2 options no valid

runcobol.exe idx2cv
COBOL data reference error 104 at line 106 in idx2cvs
106 000013 IF CMD-LENGTH = 0

runcobol.exe idx2cvs '211.idx;cosa.txt'
' options no valid

compilado
rmcobol 6.07 y rmcobol 7.00.02

no ejecuta el programa

JCantero
28 de junio de 2022, 22:39
@luisbago, si lo ejecuta y te da una excepción de opción no válida.

Tienes que indicar al runtime que le envias parametros externos.

Prueba de esta forma: (respetando los espacios en blanco)


runcobol.exe idx2cvs a=' 211.idx; cosa.txt'

luisbago
5 de julio de 2022, 16:20
Gracias, funciono con unos arreglos.

Después paso lo siguiente:

Un campo declarado en el FD "NSS PIC 9(11) COMP-3." marca el siguiente error 0147: E Data item with DISPLAY usage expected

hay varios registros declarados como comp-3, comp y comp-6, como se convierte a texto para colocarlo en el archivo declarado como *.txt (cosa.txt)

JCantero
5 de julio de 2022, 16:42
@luisbago, ya te lo dije cuando te envié el .cbl arreglado.

- En una sentencia string ...... no puedes poner campos computacionales, lo he movido a un campo de edicion

Tienes que moverlo a un campo de edición y adjuntar ese campo.


* Si tienes este campo numerico
01 NSS PIC 9(11) COMP-3.

* defines uno de edicion en working
01 nss-e pic z(11).

* en la procedure division
move nss to nss-e.

* y haces uso de nss-e en vez de nss


El anterior campo de edición te deja un string con espacios en blanco a la izquierda(_________123) si lo quieres así (000000000123) pon pic 9(11) en vez de pic z(11). Tambien te puede interesar pic z(10)9