PDA

Ver la Versión Completa : [Sintaxis] Pasar CSV a texto plano


theezraak
21 de octubre de 2016, 10:44
Buenos días, tengo un ejercicio de practica, y tengo que pasar de CSV a texto planto, con ciertos requisitos (2 campos ordenados en ascendente).
Y me da 1 error mi programa que es al abrir el fichero, pero no sé que más hacer.
Agradecería que alguien me lo explicara, un saludo.

Os dejo aquí el programita:
IDENTIFICATION DIVISION.
PROGRAM-ID. CJ4.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FICH1 ASSIGN TO 'APELLIDOS.csv'
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT FICH2 ASSIGN TO 'FICH2.DAT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-WORK ASSIGN TO SORTWORK.
DATA DIVISION.
FILE SECTION.

FD FICH1
RECORD CONTAINS 38 CHARACTERS.

01 DATOS.
05 IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 APELLIDO PIC X(20).
05 FILLER PIC X.
05 REGION PIC X(09).

FD FICH2
RECORD CONTAINS 38 CHARACTERS.

01 DATOS-2.
05 IDENTIFICADOR-2 PIC 9(07).
05 FILLER PIC X.
05 APELLIDO-2 PIC X(20).
05 FILLER PIC X.
05 REGION-2 PIC X(09).

SD SORT-WORK
RECORD CONTAINS 38 CHARACTERS.

01 SORT-WORK-RECORD.

05 SW-APELLIDO PIC 9(07).
05 FILLER PIC X.
05 SW-REGION PIC X(09).
05 FILLER PIC X(21).


WORKING-STORAGE SECTION.
01 LINEA.
02 LIDEN PIC 9(07)BB.
02 LAPELL PIC X(20)BB.
02 LREG PIC X(09).
01 OP PIC X.

PROCEDURE DIVISION.
MAIN-PROCEDURE.

PERFORM INICIALIZAR-FICHEROS
SORT SORT-WORK
ON ASCENDING KEY APELLIDO
ON ASCENDING KEY REGION
INPUT PROCEDURE CARGAR
OUTPUT PROCEDURE SALIDA
.
*----------------------------------------------------------------*
INICIALIZAR-FICHEROS.
OPEN INPUT FICH1
OPEN OUTPUT FICH2
.
INICIALIZAR-FICHEROS-FIN.
EXIT.
*----------------------------------------------------------------*
CARGAR.
OPEN INPUT FICH1
PERFORM LEER
PERFORM FIN-FICH
.
CARGAR-FIN.
EXIT.
*----------------------------------------------------------------*
LEER.
READ FICH1 NEXT RECORD AT END GO FIN-FICH.
MOVE APELLIDO TO SW-APELLIDO.
MOVE REGION TO SW-REGION.
RELEASE SORT-WORK-RECORD.
LEER-FIN.
EXIT.
*----------------------------------------------------------------*
FIN-FICH.
CLOSE FICH1.
FIN-FICH-FIN.
EXIT.
*----------------------------------------------------------------*
SALIDA.
PERFORM INICIAR-SALIDA.
PERFORM FIN-SALIDA.
SALIDA-FIN.
EXIT.
*----------------------------------------------------------------*
INICIAR-SALIDA.
RETURN SORT-WORK AT END GO FIN-SALIDA.
MOVE SW-APELLIDO TO APELLIDO-2.
MOVE SW-REGION TO REGION-2.
DISPLAY LINEA LINE 20.
ACCEPT OP LINE 21.
GO INICIAR-SALIDA.
INICIAR-SALIDA-FIN.
EXIT.

*----------------------------------------------------------------*
FIN-SALIDA.
EXIT.
FIN-SALIDA-FIN.
EXIT.
*----------------------------------------------------------------*
CLOSE FICH1.
CLOSE FICH2.

STOP RUN.
END PROGRAM CJ4.

Kuk
21 de octubre de 2016, 11:19
theezraak, qué error te da exactamente? Si no te sale cual es, usa el FILE-STATUS y haz un DISPLAY para ver qué ocurre.

Además, para qué mantienes los FILLER en el fichero de salida? Si estás pasando a texto plano, no son necesarios.

theezraak
21 de octubre de 2016, 11:36
theezraak, qué error te da exactamente? Si no te sale cual es, usa el FILE-STATUS y haz un DISPLAY para ver qué ocurre.

Además, para qué mantienes los FILLER en el fichero de salida? Si estás pasando a texto plano, no son necesarios.

Cabe destacar, que CSV es erroneo, es un DAT con formato CSV. Aún así me da error.
De pongo el error que me da:
Sort-merge key is not defined in record associated with sort

Kuk
21 de octubre de 2016, 14:10
CSV es erroneo, es un DAT con formato CSV. Aún así me da error.
No me estoy enterando. CSV es simplemente una extensión de fichero. El formato en sí es texto plano, donde los datos van separados por punto y coma. No es como los doc/docx (que no son texto plano). Así que no entiendo por qué dices que es erróneo.

Por cierto, los párrafos XXXXX-FIN no sirven de nada si no haces PERFORM THRU. El THRU no es recomendado, por lo tanto los puedes suprimir (en vez de añadir los THRU XXXXX-FIN).

En realidad, yo nunca he usado el SORT interno, pero me parece que error viene de tus párrafos CARGAR y SALIDA. Son párrafos que están en un bucle implícito, no puede haber OPEN ni CLOSE dentro. Sólo hay que dejar las instrucciones que quieres que se ejecuten con cada iteración de lectura/escritura.

Hrmcobol
22 de octubre de 2016, 03:44
Hola Amigo, este código lee un archivo y graba otro ordenado por dos campos. Saque y cambie algunas cosas, no recuerdo bien como era el tema del sort interno, pero si compila debería funcionar.

Coboleros si leen esto revisar por favor. Saludos a todos


IDENTIFICATION DIVISION.
PROGRAM-ID. CJ4.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT FICH1 ASSIGN TO 'FICH1.CSV'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT FICH2 ASSIGN TO 'FICH2.DAT'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT SORT-WORK ASSIGN TO SORTWORK.

DATA DIVISION.
FILE SECTION.

FD FICH1
RECORD CONTAINS 38 CHARACTERS.
01 F1-FICH1.
05 F1-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F1-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F1-REGION PIC X(09).

FD FICH2
RECORD CONTAINS 38 CHARACTERS.
01 F2-FICH2.
05 F2-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F2-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F2-REGION PIC X(09).

SD SORT-WORK
RECORD CONTAINS 38 CHARACTERS.
01 SORT-WORK-RECORD.
05 SW-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 SW-APELLIDO PIC X(20).
05 FILLER PIC X.
05 SW-REGION PIC X(09).


WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAIN-PROCEDURE SECTION.

PERFORM INICIALIZAR-FICHEROS
SORT SORT-WORK
ON ASCENDING KEY SW-APELLIDO
ON ASCENDING KEY SW-REGION
INPUT PROCEDURE CARGAR *> Me parece que los Procedure deben ser Section
OUTPUT PROCEDURE SALIDA. *> y una section termina en otra section

STOP RUN.
*----------------------------------------------------------------*
END PROGRAM CJ4.
*----------------------------------------------------------------*
CARGAR SECTION.
OPEN INPUT FICH1
PERFORM LEER THRU LEER-FIN
CLOSE FICH1.
CARGAR-FIN SECTION.
EXIT.
*----------------------------------------------------------------*
LEER.
READ FICH1 NEXT RECORD AT END GO LEER-FIN.
MOVE F1-IDENTIFICADOR TO SW-IDENTIFICADOR.
MOVE F1-APELLIDO TO SW-APELLIDO.
MOVE F1-REGION TO SW-REGION.
RELEASE SORT-WORK-RECORD.
GO TO LEER.
LEER-FIN.
EXIT.
*----------------------------------------------------------------*
SALIDA SECTION.
OPEN OUTPUT FICH2
PERFORM INICIAR-SALIDA.
CLOSE FICH2
SALIDA-FIN SECTION.
EXIT.
*----------------------------------------------------------------*
INICIAR-SALIDA.
RETURN SORT-WORK AT END GO INICIAR-SALIDA-FIN.
MOVE SW-IDENTIFICADOR TO F2-IDENTIFICADOR.
MOVE SW-APELLIDO TO F2-APELLIDO.
MOVE SW-REGION TO F2-REGION.
WRITE F2-FICH2.
GO TO INICIAR-SALIDA.
INICIAR-SALIDA-FIN.
EXIT.
*----------------------------------------------------------------*

theezraak
24 de octubre de 2016, 08:45
No me estoy enterando. CSV es simplemente una extensión de fichero. El formato en sí es texto plano, donde los datos van separados por punto y coma. No es como los doc/docx (que no son texto plano). Así que no entiendo por qué dices que es erróneo.

Por cierto, los párrafos XXXXX-FIN no sirven de nada si no haces PERFORM THRU. El THRU no es recomendado, por lo tanto los puedes suprimir (en vez de añadir los THRU XXXXX-FIN).

En realidad, yo nunca he usado el SORT interno, pero me parece que error viene de tus párrafos CARGAR y SALIDA. Son párrafos que están en un bucle implícito, no puede haber OPEN ni CLOSE dentro. Sólo hay que dejar las instrucciones que quieres que se ejecuten con cada iteración de lectura/escritura.

Por lo que conseguí el viernes, era error mio, no era csv era .dat
Ahora solo me graba 1 registro, poco a poco.

---------- Post añadido : 08:45 ---------- Post anterior : 08:43 ----------

Hola Amigo, este código lee un archivo y graba otro ordenado por dos campos. Saque y cambie algunas cosas, no recuerdo bien como era el tema del sort interno, pero si compila debería funcionar.

Coboleros si leen esto revisar por favor. Saludos a todos


IDENTIFICATION DIVISION.
PROGRAM-ID. CJ4.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT FICH1 ASSIGN TO 'FICH1.CSV'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT FICH2 ASSIGN TO 'FICH2.DAT'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT SORT-WORK ASSIGN TO SORTWORK.

DATA DIVISION.
FILE SECTION.

FD FICH1
RECORD CONTAINS 38 CHARACTERS.
01 F1-FICH1.
05 F1-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F1-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F1-REGION PIC X(09).

FD FICH2
RECORD CONTAINS 38 CHARACTERS.
01 F2-FICH2.
05 F2-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F2-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F2-REGION PIC X(09).

SD SORT-WORK
RECORD CONTAINS 38 CHARACTERS.
01 SORT-WORK-RECORD.
05 SW-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 SW-APELLIDO PIC X(20).
05 FILLER PIC X.
05 SW-REGION PIC X(09).


WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAIN-PROCEDURE SECTION.

PERFORM INICIALIZAR-FICHEROS
SORT SORT-WORK
ON ASCENDING KEY SW-APELLIDO
ON ASCENDING KEY SW-REGION
INPUT PROCEDURE CARGAR *> Me parece que los Procedure deben ser Section
OUTPUT PROCEDURE SALIDA. *> y una section termina en otra section

STOP RUN.
*----------------------------------------------------------------*
END PROGRAM CJ4.
*----------------------------------------------------------------*
CARGAR SECTION.
OPEN INPUT FICH1
PERFORM LEER THRU LEER-FIN
CLOSE FICH1.
CARGAR-FIN SECTION.
EXIT.
*----------------------------------------------------------------*
LEER.
READ FICH1 NEXT RECORD AT END GO LEER-FIN.
MOVE F1-IDENTIFICADOR TO SW-IDENTIFICADOR.
MOVE F1-APELLIDO TO SW-APELLIDO.
MOVE F1-REGION TO SW-REGION.
RELEASE SORT-WORK-RECORD.
GO TO LEER.
LEER-FIN.
EXIT.
*----------------------------------------------------------------*
SALIDA SECTION.
OPEN OUTPUT FICH2
PERFORM INICIAR-SALIDA.
CLOSE FICH2
SALIDA-FIN SECTION.
EXIT.
*----------------------------------------------------------------*
INICIAR-SALIDA.
RETURN SORT-WORK AT END GO INICIAR-SALIDA-FIN.
MOVE SW-IDENTIFICADOR TO F2-IDENTIFICADOR.
MOVE SW-APELLIDO TO F2-APELLIDO.
MOVE SW-REGION TO F2-REGION.
WRITE F2-FICH2.
GO TO INICIAR-SALIDA.
INICIAR-SALIDA-FIN.
EXIT.
*----------------------------------------------------------------*



Hola, gracias por la ayudita. Con ese codigo, y habiendole hecho unas modis, me da error en el Cargar section, es necesario poner SECTION cuando se usa el SORT?
Un saludo!

JCantero
24 de octubre de 2016, 09:27
Lo primero: La definicion del fichero para hacer el sort.
o defines la variable sortwork o bien la pones como una constante entre
comillas. Asi:

SELECT SORT-WORK ASSIGN TO 'SORTWORK'.


Segundo, quita lo de las "SECTION' no son necesarias. Pero si las utilizas no puedes llamar a procedimientos que estan fuera de la 'SECTION'. Mejor quitalas.


Tercero, inicalizar-ficheros no lo tienes implementado.

Cuarto , END-PROGRAM ponlo al final o quitalo. No hace falta

Quinto, CLOSE FICH2 pon el punto porque es final de parrafo CLOSE FICH2.

sexto, quita los exit.

septimo cambia "PERFORM INICIAR-SALIDA" por "PERFORM INICIAR-SALIDA thru iniciar-salida-fin".

Ya con eso, compila y nos cuentas.

Saludos

---------- Post añadido : 09:24 ---------- Post anterior : 09:16 ----------

Te quedaria asi:


IDENTIFICATION DIVISION.
PROGRAM-ID. CJ4.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT FICH1 ASSIGN TO 'FICH1.CSV'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT FICH2 ASSIGN TO 'FICH2.DAT'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT SORT-WORK ASSIGN TO 'SORTWORK'.

DATA DIVISION.
FILE SECTION.

FD FICH1
RECORD CONTAINS 38 CHARACTERS.
01 F1-FICH1.
05 F1-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F1-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F1-REGION PIC X(09).

FD FICH2
RECORD CONTAINS 38 CHARACTERS.
01 F2-FICH2.
05 F2-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F2-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F2-REGION PIC X(09).

SD SORT-WORK
RECORD CONTAINS 38 CHARACTERS.
01 SORT-WORK-RECORD.
05 SW-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 SW-APELLIDO PIC X(20).
05 FILLER PIC X.
05 SW-REGION PIC X(09).


WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAIN-PROCEDURE.

* PERFORM INICIALIZAR-FICHEROS
SORT SORT-WORK
ON ASCENDING KEY SW-APELLIDO
ON ASCENDING KEY SW-REGION
INPUT PROCEDURE CARGAR
OUTPUT PROCEDURE SALIDA.

STOP RUN.
*----------------------------------------------------------------*
* END PROGRAM CJ4.
*----------------------------------------------------------------*
CARGAR.
OPEN INPUT FICH1
PERFORM LEER THRU LEER-FIN
CLOSE FICH1.
CARGAR-FIN.
EXIT.
*----------------------------------------------------------------*
LEER.
READ FICH1 NEXT RECORD AT END GO LEER-FIN.
MOVE F1-IDENTIFICADOR TO SW-IDENTIFICADOR.
MOVE F1-APELLIDO TO SW-APELLIDO.
MOVE F1-REGION TO SW-REGION.
RELEASE SORT-WORK-RECORD.
GO TO LEER.
LEER-FIN.
*----------------------------------------------------------------*
SALIDA.
OPEN OUTPUT FICH2
PERFORM INICIAR-SALIDA thru iniciar-salida-fin.
CLOSE FICH2.
SALIDA-FIN.
*----------------------------------------------------------------*
INICIAR-SALIDA.
RETURN SORT-WORK AT END GO INICIAR-SALIDA-FIN.
MOVE SW-IDENTIFICADOR TO F2-IDENTIFICADOR.
MOVE SW-APELLIDO TO F2-APELLIDO.
MOVE SW-REGION TO F2-REGION.
WRITE F2-FICH2.
GO TO INICIAR-SALIDA.
INICIAR-SALIDA-FIN.
*----------------------------------------------------------------*



---------- Post añadido : 09:27 ---------- Post anterior : 09:24 ----------

Lo he probado:

fichero csv


12 jsjjsj
1 4324
1 1111




fichero dat



1 111
1 324
12 sjjsj

Kuk
24 de octubre de 2016, 09:39
JCantero, los párrafos de XXXX-FIN no sirven de nada tampoco. Además, muchos compiladores no compilan un párrafo vacío, así que el EXIT se convierte en obligatorio.

Las SECTION, los párrafos con -FIN y el THRU no son recomendados, yo no los uso nunca. Los puntos tampoco. El único punto obligatorio es el del final del párrafo. Los GO TO tampoco son recomendados, suelen ser prohibidos por estándar. Es preferible usar los PERFORM.

theezraak
24 de octubre de 2016, 11:01
JCantero, los párrafos de XXXX-FIN no sirven de nada tampoco. Además, muchos compiladores no compilan un párrafo vacío, así que el EXIT se convierte en obligatorio.

Las SECTION, los párrafos con -FIN y el THRU no son recomendados, yo no los uso nunca. Los puntos tampoco. El único punto obligatorio es el del final del párrafo. Los GO TO tampoco son recomendados, suelen ser prohibidos por estándar. Es preferible usar los PERFORM.

Uso el fin porque me va bien para situarme.
Te pongo el codigo que tengo ahora, de momento ahora me da 1 error al leer el fichero.
Un saludo y gracias!

IDENTIFICATION DIVISION.
PROGRAM-ID. CJ4.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT FICH1 ASSIGN TO 'APELLIDO.DAT'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT FICH2 ASSIGN TO 'FICH2.DAT'
ORGANIZATION IS LINE SEQUENTIAL.

SELECT SORT-WORK ASSIGN TO SORTWORK.

DATA DIVISION.
FILE SECTION.

FD FICH1
RECORD CONTAINS 38 CHARACTERS.
01 F1-FICH1.
05 F1-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F1-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F1-REGION PIC X(09).

FD FICH2
RECORD CONTAINS 38 CHARACTERS.
01 F2-FICH2.
05 F2-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 F2-APELLIDO PIC X(20).
05 FILLER PIC X.
05 F2-REGION PIC X(09).

SD SORT-WORK
RECORD CONTAINS 38 CHARACTERS.
01 SORT-WORK-RECORD.
05 SW-IDENTIFICADOR PIC 9(07).
05 FILLER PIC X.
05 SW-APELLIDO PIC X(20).
05 FILLER PIC X.
05 SW-REGION PIC X(09).


WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAIN-PROCEDURE.
SORT SORT-WORK
ON ASCENDING KEY SW-APELLIDO
ON ASCENDING KEY SW-REGION
INPUT PROCEDURE CARGAR
OUTPUT PROCEDURE SALIDA.
STOP RUN.
*----------------------------------------------------------------*
CARGAR SECTION.
OPEN INPUT FICH1.
PERFORM LEER.
LEER.
READ FICH1 AT END PERFORM FIN-LEER.
MOVE F1-IDENTIFICADOR TO SW-IDENTIFICADOR.
MOVE F1-APELLIDO TO SW-APELLIDO.
MOVE F1-REGION TO SW-REGION.
RELEASE SORT-WORK-RECORD.
PERFORM LEER.

FIN-LEER.
CLOSE FICH1.
FIN-LEER-FIN.
EXIT.
*----------------------------------------------------------------*
SALIDA SECTION.
OPEN OUTPUT FICH2.
PERFORM INICIAR-SALIDA.
CLOSE FICH2.
INICIAR-SALIDA.
RETURN SORT-WORK AT END GO INICIAR-SALIDA-FIN.
MOVE SW-IDENTIFICADOR TO F2-IDENTIFICADOR.
MOVE SW-APELLIDO TO F2-APELLIDO.
MOVE SW-REGION TO F2-REGION.
WRITE F2-FICH2.
PERFORM INICIAR-SALIDA.
INICIAR-SALIDA-FIN.
EXIT.
*----------------------------------------------------------------*
END PROGRAM CJ4.
*----------------------------------------------------------------*

theezraak, usa el resalto de sintaxis!

---------- Post añadido : 11:01 ---------- Post anterior : 10:12 ----------

Ya me funciona gracias al codigo de JCantero.
La verdad que parecía más facil de lo que era.
Muchas gracias a todos por las aportaciones!!!