Greetings ODS Tagset Gurus.
I am working on a customised CSV tagset that has the following changes:
This I have done successfully. The problem remains is that the CSV file created contains a blank line at both the top and the bottom.
I started with the custom tagset from here:
and tweaked it like this:
define
notes 'This is the MDR CSV template';
define event table;
start:
put 'Start';
finish:
put 'End';
end;
*/
define event put_value;put VALUE;end
finish:
putdefine event header;
start:
put ',' /if ^cmp( COLSTART, '1');
put '''';
put VALUE;
finish:
put '''';
end;
*/
definestart:
put ',' /if ^cmp( COLSTART, '1'put ''''; */
endregistered_tm =
'(r)'trademark =
'(tm)'copyright =
'(c)'output_type =
'csv'stacked_columns = OFF;
end
run
I then tested the tagset like this:
ods Tagsets.csv_mdr file = "test.csv" ;
proc print data = sashelp.class noobs;
run;
ods Tagsets.csv_mdr close;
ods listing;
I am running SAS 9.1.3 SP4 under Windows. I suspect a tweak of the row event is required because if you comment this out all data ends up on the same line. Would appreciate some help in what this tweak should be!
tagset Tagsets.csv_mdr;
Hi:
I would use a different approach. I would use PROC REPORT with the NOHEADER option to get rid of the column headers in the report file. Then I would just write a tagset template that inherited everything from regular CSV, but only got rid of the quotes. There is an EVENT for QUOTES. I would essentially turn it off, as shown in the code below. This bypasses the need to tinker with the ROW event. If you want to pursue your solution, then I suggest you try to track down the "extra" lines by finding the places where you write NL (newline) by selectively taking them out until you find the one(s) that are causing the issue.
cynthia
proc template;
define tagset Tagsets.myCsv;
parent=tagsets.csv;
notes "This is the changed CSV definition no quotes";
define event quotes;
start:
break;
finish:
break ;
end;
end;
run;
ods tagsets.mycsv file='c:\temp\test2.csv';
proc report data=sashelp.shoes noheader nowd;
where region = 'Western Europe';
column region subsidiary product sales inventory;
run;
ods tagsets.mycsv close;
Great solution Cynthia. However I want to scale this up to a dataset with 100,000 rows and 64 columns. Unfortunately PROC REPORT fails with out of memory errors on this volume of data with the CSV tagset. PROC PRINT works fine. I have managed to get it working with PROC PRINT using the official CSV tagset (change in bold) but only when the last column is fully populated, by using an event row like below. But I really want it to handle even totally missing columns. Thanks a lot for your help.
define event row;
finish:
do /if $cell_count;
close;
eval $cell_count 0;
/*-----------------------------------------------------------eric-*/
/*-- End of second row, only thing there is the --*/
/*-- rowheaders. print the data cell that were saved --*/
/*-- from the row above. --*/
/*--------------------------------------------------------17Nov03-*/
else /if $$row;
put $$row;
unset $$row;
done;
put nl / if $VALUE ;
end;
In the end I solved this without ODS. OK, its not as flexible, but at least it gets the job done, and is pretty quick!
%macro export_csv_noheader (dsname =
,outfile =
);
filename exTemp temp;
proc export data = &dsname
outfile = exTemp
dbms = csv
REPLACE
;
quit;
data _null_;
infile extemp firstobs = 2;
file &outfile;
input;
put _infile_;
run;
filename exTemp CLEAR;
%mend export_csv_noheader;
There is no more another datastep. use putnames=no option.
proc export data = sashelp.class
outfile = 'c:\class.csv'
dbms = csv
REPLACE
;
putnames=no;
quit;
Ksharp
Thanks Ksharp. Unfortunately I forgot to mention I am limited to SAS 9.1.3, and PUTNAMES only came in with 9.2. I live in hope that we may get upgraded some day....
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.