Consultor Eletrônico



Kbase P93481: How to parse a table's data dump information file with 4GL code?
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   07/01/2005
Status: Unverified

GOAL:

How to parse a table's data dump information file with 4GL code?

GOAL:

4GL code to separate data dump information created by Data Dump utility or EXPORT statement.

FIX:

The following sample code parses the data dump from a table made by EXPORT statement or Data Administration utility.
For each record the fields values are concatenated into a space delimiter list
with character fields double quoted.

Parsedump.p program will create a character list where the fields are separated
by a non-printable character( eg. CHR(1) ).

Testparse.p shows how to call parsedump.p and how to work with the output from
parsedump.p.

/* testdump.p */
DEF VAR pc AS CHAR.
DEF VAR pres AS CHARACTER NO-UNDO.
DEF VAR cdel AS CHARACTER NO-UNDO.

/* this is how the 1st record from customer table looks like into a dump file */
pc =
'1 "USA" "Lift Tours" "276 North Drive" "" "Burlington" "MA" "01730" "Gloria Shepley" "(617) 450-0086" "HXM" 66700 903.64 "Net30" 35 "This customer is on credit hold." "" "" ""'.

RUN parsedump.p ( pc, OUTPUT pres, OUTPUT cdel ).

DEF VAR vi AS INT.

DISPLAY pc NO-LABEL FORMAT "x(70)" WITH FRAME fx .

REPEAT vi = 1 TO NUM-ENTRIES( pres, cdel ):
DISPLAY ENTRY( vi, pres, cdel ) FORMAT "x(20)".
END.
/* testdump.p end */

/* parsedump.p */
DEF INPUT PARAM pc AS CHARACTER NO-UNDO.
DEF OUTPUT PARAM pres AS CHARACTER NO-UNDO.
DEF OUTPUT PARAM cdel AS CHARACTER NO-UNDO.

DEF VAR cpos AS CHARACTER.
DEF VAR cnext AS CHARACTER.
DEF VAR iLen AS INTEGER.

DEF VAR lquoted AS LOGICAL NO-UNDO INIT FALSE.

DEF VAR vi AS INTEGER.

cdel = CHR(1).
pres = "".

iLen = LENGTH( pc ).
REPEAT vi = 1 TO ilen :

cpos = SUBSTRING( pc, vi, 1 ).
cnext = SUBSTRING( pc, vi + 1, 1 ).

CASE cpos:
WHEN '"' THEN DO:
IF lquoted = FALSE THEN lquoted = TRUE.
ELSE IF lquoted = TRUE THEN DO:
IF cnext = '"' THEN
ASSIGN
pres = pres + cpos
vi = vi + 1
.
ELSE DO:
lquoted = ?.
IF vi < iLen THEN pres = pres + cdel.
END.
END.
ELSE IF lquoted = ? THEN DO:
MESSAGE "error parsing " pc " position " vi " char " cpos.
RETURN "Error".
END.
END.
WHEN ' ' THEN DO:
IF lquoted = TRUE THEN pres = pres + cpos.
ELSE IF lquoted = ? THEN lquoted = FALSE.
ELSE pres = pres + cdel.
END.
OTHERWISE pres = pres + cpos.
END CASE.
END.

RETURN.
/* parsedump.p end */