Yes. The WIDTH from the $Q format is NOT being passed to the $QUOTE format call. Instead it is defaulting to $QUOTE40. which means there is room for only 38 characters. So include the width in the nested format in the defintion.
PROC FORMAT;
VALUE $Q(MAX=32767) ' '='""' other=[$quote32767.] ;
RUN;
But you might also be truncating the total line length. Why did you include a LRECL of 10,000? That is SHORTER than the default of 32,767? In my example I use a LRECL or 1,000,000 to show that you could use values larger than the default.
But if your variables have the wrong format then the PUT statement will truncate, no matter what you do if you let SAS use those formats for printing. For example try this program:
1671 data test;
1672 x='This is a long string';
1673 format x $10.;
1674 put x;
1675 run;
This is a
The maximum length for a character variable is 32,767 bytes. So if the total width of the generated lines is less than this then the simple postprocessing using the _INFILE_ variable will work.
%LET OutFileQ = &OFP.\&OutFileMask..&OutExtension.;
%LET TempFile = &OFP.\TempLab.txt;
FILENAME step1 "&TempFile";
FILENAME OUTFILE "&outfileq";
DATA _NULL_;
SET WORK.OUT2_LAB;
FILE step1 DSD LRECL=32767;
PUT (_ALL_) (~);
RUN;
DATA _NULL_;
INFILE step1 LRECL=32767;
FILE outfile LRECL=32767;
INPUT;
_infile_=tranwrd(cats(',',_infile_,','),'," ",',',"",');
_infile_=tranwrd(_infile_,',".",',',"",');
_infile_=substr(_infile_,2,length(_infile_)-2);
PUT _infile_;
RUN;
If you want to use the other method then use something larger than 200 if some of your variables could require that.
PROC FORMAT;
VALUE $Q(MAX=32767) ' '='""' other=[$quote32767.] ;
RUN;
DATA _NULL_;
SET WORK.OUT2_LAB;
FILE step1 DSD LRECL=2000000;
PUT (_ALL_) (+0);
RUN;
DATA _NULL_;
INFILE step1 DSD LENGTH=LL COLUMN=CC TRUNCOVER LRECL=2000000;
FILE "&OutFileQ." DLM=',' LRECL=2000000;
DO UNTIL (CC>LL);
INPUT VALUE :$32765. @;
PUT VALUE :$Q32767. @;
END;
PUT;
RUN;
NOTE: That printing with the $QUOTE format the width specified counts the quotes. So $QUOTE10. will print the first 8 characters of the string.
... View more