DATA Step, Macro, Functions and more

trying to read cobol raw dataset and converting into output dataset in CSV format.

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 12
Accepted Solution

trying to read cobol raw dataset and converting into output dataset in CSV format.

Hi Team,

 

I have a requirement to convert COBOL raw dataset to readable format, to achieve this i am reading a cobol copy book and converting each field type to SAS equivalent field types.

 

Now i am inputting the COBOL raw data file to the mainframe JCL(Job) which has SAS parameters in the control card and want my output in CSV format.

 

I want my SAS to read the COBOL raw data file and convert it to corresponding field type mentioned and print the output in the file which should be in CSV format.

 

Thanks & Regards,

rakesh MS


Accepted Solutions
Solution
‎05-23-2017 10:35 AM
Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

[ Edited ]
Posted in reply to rakesh1212

To copy a screen from Personal communications, just use the mouse to mark the area and do Edit - Copy from the menu.

 

As I expected, you have a fixed format file, no delimiters.

A data step to read that file should look like

data want;
infile (use the fileref from the JCL DSN) lrecl=(value as shown) recfm=f;
input
  x71340d_va_hdr_rec_id   1.
  x71340d_va_hdr_rvsl_flag  $1.

and so on. Note that date and time values are only recognizable by name, so you will have to do the conversion all by yourself; I also see that one date comes in a zoned length 8 field, while the other is in a packed decimal length 4. So you need to inspect the actual contents for that.

For PD fields, use the s370fpd informat.

Since you have no reliable means of distiguishing date and time values from other, "normal" numbers, you will have to write most of the data step by hand.

And I would clearly not use variable names like A0001, A0002 and so on. That's 1960s style coding.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers

View solution in original post


All Replies
Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

Could you please post an example of the copy book, and a screen copy of the "Data Set Information" panel from TSO for the respective COBOL file?

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Posts: 12

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to KurtBremser

Hi Kurt,

 

Please find the scrren shots attached. I have no access to take the screen prints of the Panel.

 

 

Please note : Input file (COBOL dataset) is in Fixed block format.

Regards,

Rakesh MS


IMG_3845.JPGIMG_3846.JPGIMG_3847.JPGIMG_3848.JPG
Solution
‎05-23-2017 10:35 AM
Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

[ Edited ]
Posted in reply to rakesh1212

To copy a screen from Personal communications, just use the mouse to mark the area and do Edit - Copy from the menu.

 

As I expected, you have a fixed format file, no delimiters.

A data step to read that file should look like

data want;
infile (use the fileref from the JCL DSN) lrecl=(value as shown) recfm=f;
input
  x71340d_va_hdr_rec_id   1.
  x71340d_va_hdr_rvsl_flag  $1.

and so on. Note that date and time values are only recognizable by name, so you will have to do the conversion all by yourself; I also see that one date comes in a zoned length 8 field, while the other is in a packed decimal length 4. So you need to inspect the actual contents for that.

For PD fields, use the s370fpd informat.

Since you have no reliable means of distiguishing date and time values from other, "normal" numbers, you will have to write most of the data step by hand.

And I would clearly not use variable names like A0001, A0002 and so on. That's 1960s style coding.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Super User
Super User
Posts: 7,942

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

Sorry, please post clear examples of data/programs etc associated with the question.  I don't have Cobol files lying around to use.  From a quick Google copybook is nothing more than a Cobol program?  What is the data file format, is it binary or text.  If its text then simply a matter of identifying columns/rows an reading in using a datastep.  If its binary then this is quite a bit harder.

Here is a link you may find useful:

https://stackoverflow.com/questions/4877379/reading-a-cobol-generated-file

 

Occasional Contributor
Posts: 12

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212
Hi kurt,

Thanks for looking into this. Will incorporate all the comments given. Just a concern, where do I mention the output file which I need it in CSV format.

Regards,
Rakesh
Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

You will need another dsn in the JCL script that gives you a reference for the output file; use that as a fileref within your SAS program, and when writing from your dataset, add the corresponding options (lrecl= and recfm=) to the file statement in the data _null_ step.

ie

In the JCL you have a DSN for OUT

In SAS:

data _null_;
set your_dataset;
file out recfm=vb lrecl=1000 dlm=',' dsd;
put
  /* variables */
;
run;
---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Super User
Super User
Posts: 7,039

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

Unless your file is huge (more than 100 Gigabytes?) I would first read it into a SAS dataset and then generate the CSV file (if needed).

So first make a data step to read the file.

data mydata;
   infile .... ;
   input .... ;
   ....
run;

You can use PROC EXPORT to generate a CSV file.

proc export data=mydata file='mydata.csv' dbms=dlm ;
  delimiter=',';
run;

Or you can very easily write a CSV file directly using a data step, especially if you do not need to include a header row.

data _null_;
  set mydata;
  file 'mydata.csv' dsd ;
  put (_all_) (+0);
run;

If the file is really large then you can use the FILE and PUT statement of the last data step as part of the step that reads the COBOL file and skip making even a SAS WORK dataset.

Occasional Contributor
Posts: 12

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Hi tom,

 Ihave two Questions for you 

1) i am trying to use data _null_;
set temp1;
file 'output file' dlm=',' dsd ;
put (_all_) (+0);
run;

How to switch on the labels. I need the labels on the top row and then the values below it.

 

2) I tried using 

proc export data=mydata file='mydata.csv' dbms=dlm ;
  delimiter=',';
run;

proc export data=temp1 file='outputfile' dbms=dlm;

   delimiter=',';

run;

 

Regards,

Rakesh MS

run;

 

It gives me error ; Statement not valid or it is used out of proper order 

 

Delimiter=','

tatement not valid or it is used out of proper order

Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

delimiter= is an option of the proc export statement, so you need to remove the semicolon preceding it.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Posts: 12

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to KurtBremser

kurt,

 

How do we display the labels  ? and one more thing, can we dynamically convert the data to readable format with out knowing their data types ?. Actually there are lot of redefine clauses in the mainframe copy book. Field which is getting redefined has a different field type compared to redefined field.

 

Can we handle header and trailer of the file separately ??, header and trailer data is been adding prior in every data that is present.

 

let me know if you need any more information

 

Regards,

Rakesh MS

 

 

Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

In a "manual" data step, you need to add the header line in the code:

data _null_;
set temp1;
file 'output file' dlm=',' dsd ;
if _n_ = 1 then put "headertext,in,correct,format,comes,here";
put (_all_) (+0);
run;
---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

What do you mean by "without knowing their data types"? If you don't know your data, how are you supposed to work with it? Read the documentation and work from that. Data without documentation is returned to sender with a corresponding nastygram.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
Occasional Contributor
Posts: 12

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to KurtBremser

I asked you this question becasue of redefine clause in the COBOL copy book. Copy book fields are internally redefined so that they use the same space to store but when they get redefined they are defined with different data types.

 

Can you help me with label syntax. I want a label for every field and data to be under it in the output file.

 

 

Regards,

Rakesh MS

Super User
Posts: 7,771

Re: trying to read cobol raw dataset and converting into output dataset in CSV format.

Posted in reply to rakesh1212

If you do not have sufficient documentation and there is no way to get it (HIGHLY unlikely as COBOL is typically used in environments where everybody was extremely anal about proper documentation. Think banking, insurance, and the like), then you need to start reading the COBOL sources to get a picture of what the data files really contain.

 

For header lines, see this example using SASHELP.CLASS:

data _null_;
set sashelp.class;
file '$HOME/sashelp.csv' dlm=',';
if _n_ = 1 then put 'Name,Sex,Age,Height,Weight';
put name sex age height weight;
run;

The resulting file then looks like this:

Name,Sex,Age,Height,Weight
Alfred,M,14,69,112.5
Alice,F,13,56.5,84
Barbara,F,13,65.3,98
Carol,F,14,62.8,102.5
Henry,M,14,63.5,102.5
James,M,12,57.3,83
Jane,F,12,59.8,84.5
Janet,F,15,62.5,112.5
Jeffrey,M,13,62.5,84
John,M,12,59,99.5
Joyce,F,11,51.3,50.5
Judy,F,14,64.3,90
Louise,F,12,56.3,77
Mary,F,15,66.5,112
Philip,M,16,72,150
Robert,M,12,64.8,128
Ronald,M,15,67,133
Thomas,M,11,57.5,85
William,M,15,66.5,112

 

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 24 replies
  • 282 views
  • 4 likes
  • 4 in conversation