CSV command examples
These examples present complete JCL for converting logs to CSV format.
Where an example shows only a SYSIN data set, the JCL is the same as the preceding example.
Converting all fields to CSV
The following JCL extracts a single CICS® monitoring facility (CMF) performance class record from the dumped SMF data set 'HLQ.SMF.DAILY', converts all of its fields to CSV, and then writes the CSV data to SYSOUT:
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//CSV DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV CODE(CMF) LABELS OUTLIM(1)
/*
The LABELS parameter causes the CSV command to write a header row with field names. By default, the CSV command does not write a header row.
The OUTLIM parameter is useful for testing, to restrict processing to a limited number of output records.
The CSV data is encoded in EBCDIC code page 1047, the default output encoding of the CSV command.
The following JCL produces similar output, but reads today's first CMF record from an SMF log stream, instead of reading the first CMF record in a data set. A LOGSTREAM command at the start of the SYSIN data set replaces the SMFIN DD statement in the previous JCL.
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//CSV DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
LOGSTREAM SMF:IFASMF.PROD
START 0 /* Today
CMF CODE(CMF) LABELS OUTLIM(1)
/*
The following JCL extracts all DB2® system statistics trace (IFCID 001) records from a dumped SMF data set, converts the data to CSV, and then writes the data to an MVS sequential data set:
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//JSON DD DSN=MY.FUW.CSV,DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(10,10),RLSE)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV CODE(DTR:001) LABELS
/*
The previous examples write each CSV row to a separate record in EBCDIC, with no end-of-line markers.
The following JCL writes CSV to a z/OS®
UNIX file in EBCDIC, with a newline character (X'0A') at the
end of each line. The output DD statement specifies FILEDATA=TEXT:
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//CSV DD PATH='/u/myid/fuw.csv',
// FILEDATA=TEXT,
// PATHOPTS=(OWRONLY,OCREAT,OEXCL),
// PATHDISP=(KEEP,DELETE),
// PATHMODE=(SIRUSR,SIWUSR,SIRGRP)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV CODE(DTR:001) LABELS
/*
The following JCL writes CSV to a z/OS
UNIX file in ASCII, with a line feed character (X'0A') at the
end of each line. The output DD statement specifies FILEDATA=BINARY and the
CSV command specifies ASCII EOL(LF):
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//CSV DD PATH='/u/myid/fuw.csv',
// FILEDATA=BINARY,
// PATHOPTS=(OWRONLY,OCREAT,OEXCL),
// PATHDISP=(KEEP,DELETE),
// PATHMODE=(SIRUSR,SIWUSR,SIRGRP)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV CODE(DTR:001) LABELS ASCII EOL(LF)
/*
Specifying which fields to extract
By default, the CSV command extracts all fields of the selected record type.
There are several methods for specifying which fields to extract. The most straightforward method is to follow the CSV command with a FIELDS command that specifies a list of field names:
CSV CODE(SMF:30.)
FIELDS(
SMF30JBN
SMF30SIT
SMF30STD
SMF30CPT
)
Selecting which records to extract
To select which records to extract, follow the CSV command with a CODE command and subsequent COND statements that specify filter conditions.
The following example selects SMF type 30 records where both of the following conditions are true:
- The record is for a job step termination
- The job owner is MYID
CSV CODE(SMF:30.)
FIELDS(
SMF30JBN
SMF30SIT
SMF30STD
SMF30CPT
)
CODE(SMF:30.) /* Must match CODE parameter of CSV command
COND SMF30STP EQ 5 /* Record subtype for job step termination
COND SMF30RUD EQ 'MYID' /* RACF user ID of the job owner
Creating a CSV file using a form
The following JCL creates a CSV file from a dumped SMF data set, based on a form named SMF30 stored in the control repository MY.FUW.CONTROLS.
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//FUWCDS DD DISP=SHR,DSN=MY.FUW.CONTROLS
//CSV DD DSN=MY.FUW.CSV,DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(10,10),RLSE)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV FORM(SMF30)
/*
To overwrite an existing CSV file, use the following CSV DD statement:
//CSV DD DSN=MY.FUW.CSV,DISP=SHR
To append to an existing CSV file:
//CSV DD DSN=MY.FUW.CSV,DISP=MOD
Creating a CSV file from SMF type 30 records filtered by job name
The following JCL creates a CSV file of SMF type 30 job termination records for job names that
begin with UID
:
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=SYSA.PROD.SMF(0)
//CSV DD DSN=MY.SMF30.CSV,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV CODE(SMF:30.) LABELS FIELDCASE(ASIS)
FIELDS(
SMF30JBN:"Job name"
SMF30CPT:"CPU time"
)
CODE(SMF:30.)
COND SMF30JBN EQ 'UID*' /* Job name
COND SMF30STP EQ 5 /* Job termination
/*
Creating CSV files for CICS, DB2, and MQ accounting
The following JCL creates three CSV files from the following log records:
- SMF 101: DB2 accounting classes 1, 2, 3, 7, and 9 (IFCID 003)
- SMF 110: CICS CMF performance class (transaction accounting)
- SMF 115: MQ accounting class 1 or 3
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SYSPRINT DD SYSOUT=*
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//CSVDB2 DD DSN=MY.CSV,DB2,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//CSVCICS DD DSN=MY.CSV.CICS,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//CSVMQ3 DD DSN=MY.CSV.MQ.CLASS3,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//CSVMQ1 DD DSN=MY.CSV.MQ,CLASS1,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//LOGRPT DD SYSOUT=*
//SYSIN DD *
CSV OUTPUT(CSVDB2) CODE(DTR:003) SCHEMA(DB2S) +
LABELS +
SECTIONS(HEADER,QWAC,QMDA,QMDAINFO) +
SECTIONS(QTXA,QTGA,QXST,QBAC,QWHS,QWHC,QWHA) +
TOKENS(ALL,DB2+)
CSV OUTPUT(CSVCICS) CODE(CMF:6E13) SCHEMA(CICSS) +
LABELS +
SECTIONS(HEADER,DFHTASK,IMSDBCTL) +
TOKENS(ALL)
CSV OUTPUT(CSVMQ3) CODE(SMF:74) SCHEMA(MQ1S) +
LABELS +
SECTIONS(HEADER,WTID,WTAS,WQSTAT,QWHS,QWHC) +
TOKENS(ALL)
CODE(SMF:116.)
COND SM116STF EQ +1 /* Class 3 detailed statistics
CSV OUTPUT(CSVMQ1) CODE(SMF:74) SCHEMA(MQ3S) +
LABELS +
SECTIONS(HEADER,QWAC,QMAC,QWHS,QWHC) +
TOKENS(ALL)
CODE(SMF:116.)
COND SM116STF EQ +0 /* Class 1 brief statistics
/*
Creating a CSV file for IMS accounting from the IMS log
The following JCL creates a CSV file for IMS transactions from the IMS log:
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SYSPRINT DD SYSOUT=*
//LOGIN DD DISP=SHR,DSN=IMSP.SLDS
//CSVIMS DD DSN=MY.IMS.CSV,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//LOGRPT DD SYSOUT=*
//SYSIN DD *
IMSVRM=156 /* IMS version 15
IMSINDEX /* Create IMS transaction index records from the log
CSV OUTPUT(CSVIMS) CODE(IMS:CA01) SCHEMA(S1) +
LABELS +
SECTIONS(ALL) TOKENS(IMS)
/*
Extracting DB2 IFCID 001 to CSV and JSON
The DB2 system statistics record (IFCID 001) is an example of a complex record that contains many (unrelated) sections that sometimes repeat.
The following JCL creates four output files:
- CSV1
- Contains fixed (non-repeating) sections.
- CSV2
- Contains instances of the repeating section QWSA in separate records.
- JSON1
- Same as CSV1, but in JSON format.
- JSON2
- Contains instances of the repeating section QWSA as array elements.
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SYSPRINT DD SYSOUT=*
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//CSV1 DD DSN=MY.DTR001.CSV1,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//CSV2 DD DSN=MY.DTR001.CSV2,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//JSON1 DD DSN=MY.DTR001.JSON1,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//JSON2 DD DSN=MY.DTR001.JSON2,
// DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(CYL,(1,1))
//LOGRPT DD SYSOUT=*
//SYSIN DD *
CSV OUTPUT(CSV1) CODE(DTR:001) SCHEMA(S1) +
LABELS +
SECTIONS(HEADER,Q9ST,QVLS,QVAS,QSST,QLST,QJST,QDST)
CSV OUTPUT(CSV2) CODE(DTR:001) SCHEMA(S2) +
LABELS +
SECTIONS(HEADER) VERTICALSECTION(QWSA)
JSON OUTPUT(JSON1) CODE(DTR:001) SCHEMA(S3) METADATA(M3) +
SECTIONS(HEADER,Q9ST,QVLS,QVAS,QSST,QLST,QJST,QDST)
JSON OUTPUT(JSON2) CODE(DTR:001) SCHEMA(S4) METADATA(M4) +
SECTIONS(HEADER) HORIZONTALSECTIONS(QWSA)
/*
Streaming heterogeneous CSV to a TCP socket
The following JCL streams three log record types in CSV format to a TCP socket on a remote system:
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//CSV DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
LOGSTREAM SMF:IFASMF.PROD
START 0 /* Today
STREAM NAME(STREAM1) HOST(splunk) PORT(6789) +
TIMEFORMAT(ISO8601) TYPECOLUMN
* CICS performance
CSV CODE(CMF) STREAM(STREAM1)
FIELDS(
TRAN, USRCPUT /* More fields...
)
* DB2 accounting
CSV CODE(DTR:003) STREAM(STREAM1)
FIELDS(
SM101SID, SM101SSI,
QWHCCTR, QWHCPLAN, QWHCOPID, QWHCCN,
ET1, CPU1, ET2, CPU2 /* More fields...
)
* Job termination
CSV CODE(SMF:30.) STREAM(STREAM1)
FIELDS(
SMF30JBN, SMF30CPT, /* More fields...
)
CODE(SMF:30.)
COND SMF30STP EQ 5
/*
The remote system must be configured to parse each CSV row based on the value of the type
field, which is the second column in each row.
Creating CSV files for viewing in a spreadsheet-like table in the plug-in
To create a CSV file that you can view in a spreadsheet-like table in the Transaction Analysis Workbench plug-in, use a CSV command with the following parameters:
- Includes a header row of column labels.
- The ddname of the CSV file must begin with the characters CSV. For example: CSV, CSV1, CSVXYZ.
- The CSV command must create metadata for the CSV. The ddname of the metadata must begin with the characters META, and the remaining characters must match the ddname for the corresponding CSV file. For example, META, META1, METAXYZ.
- The field delimiter must be a comma. This is the default value, so you do not need to explicitly specify this parameter.
//UIDFUW JOB NOTIFY=&SYSUID
//FUWBATCH EXEC PGM=FUWBATCH
//STEPLIB DD DISP=SHR,DSN=<FUW HLQ>.SFUWLINK
//SMFIN DD DISP=SHR,DSN=HLQ.SMF.DAILY
//FUWCDS DD DISP=SHR,DSN=MY.FUW.CONTROLS
//CSV1 DD SYSOUT=*
//META2 DD SYSOUT=*
//CSV2 DD SYSOUT=*
//META2 DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
CSV1 FORM(SMF30) OUTPUT(CSV1) METADATA(META1) LABELS
CSV2 FORM(CMF) OUTPUT(CSV2) METADATA(META2) LABELS
/*