简体   繁体   中英

SAS Compress function Returns FALSE value

I'm having some trouble using the 'Compress' function in SAS. My aim is to remove any alphabetical characters from the 'Comments' field in this data step.

However, when I execute the code below, the 'NewPrice' field shows FALSE rather than the expected value.

data WORK.basefile2;

        length TempFileName Filenameused $300.;
         %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
         infile CSV2 delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=3 Filename=TempFileName;             
            Filenameused= TRANWRD(substr(TempFileName, 48), ".xlsx.csv", "");
            informat customer_id $8.;
            informat Name $50.;
            informat Reco_issue $50.;
            informat Reco_action $50.;
            informat ICD $50.;
            informat Start_date $50.;
            format customer_id $8.;
            format Name $50.;
            format Reco_issue $50.;
            format Reco_action $50.;
            format ICD $50.;
            format Start_date $50.;
            format Comments $255.;
            format Description $255.;

            NewPrice=COMPRESS(Comments, '', 'kd');

            input
            customer_id $
            Name $
            'Total Spend'n $
            Template $
            Product_id $
            Description $
            Start_date $
            CD_Sales 
            CD_Lines
            CD_Level $
            CD_Price $
            CD_uom $
            CD_Discount $
            Reco_issue $
            Reco_action $
            Reco_price $
            Reco_discount $
            Impact_£
            Impact
            Agree $
            Comments $
            ICD $
            Structure_Code $
            Deal_type $
            NewPrice;
           run;

Output when code is executed

Sample data (comma delimited):

ASDFGH,TEST,"£31,333.00",15AH,156907,TEST,18/10/2016,"£4,003.10",222,5,£5.19,M,,Below Hard Floor,Change Rate,£6.63,,£0.48,21.72%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,475266,TEST,11/11/2016,£49.61,29,5,£2.52,EA,,At Hard Floor,Change Rate,£6.36,,£1.28,60.38%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,404740,TEST,21/09/2017,£38.69,1,5,£116.07,EA,,Below Hard Floor,Change Rate,£163.80,,£15.91,29.14%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,476557,TEST,11/11/2016,£32.13,25,5,£1.32,EA,,Below Hard Floor,Change Rate,£2.76,,£0.48,52.17%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,476553,TEST,11/11/2016,£29.17,11,5,£1.29,EA,,Below Hard Floor,Change Rate,£3.39,,£0.70,61.95%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,476557,TEST,11/11/2016,£17.61,5,5,£3.96,EA,,Below Hard Floor, Change Rate,£9.69,,£1.91,59.13%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,475261,TEST,11/11/2016,£16.70,4,5,£10.92,EA,,Below Hard Floor,Change Rate,£26.67,,£5.25,59.06%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,476546,TEST,11/11/2016,£15.73,10,5,£0.96,EA,,Below Hard Floor,Change Rate,£2.67,,£0.57,64.04%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,476549,TEST,11/11/2016,£5.84,3,5,£1.86,EA,,At Hard Floor,Change Rate,£6.00,,£1.38,69.00%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",15AH,477340,TEST,11/11/2016,£3.75,2,5,£4.11,EA,,Below Hard Floor,Change Rate,£11.40,,£2.43,63.95%,N,In negotiations with the customer for new prices ASDFGH,TEST,"£31,333.00",,259738,TEST,13/01/2018,"£45,173.66",403,5,£10.35,EA,20,Below Hard Floor,Change Rate,£10.80,,£0.15,4.17%,N,New Prices Agreed £3.52 ASDFGH,TEST,"£31,333.00",,297622,TEST ,13/01/2018,£736.60,5,5,£10.95,EA,20,Below Hard Floor,Change Rate,£11.46,,£0.17,4.45%,N,New Prices Agreed £3.75 ASDFGH,TEST,"£31,333.00",,105384,TEST,19/07/2017,£223.44,1,5,£11.25,BG,42.5,Below Hard Floor,Change Rate,£11.49,,£0.08,2.09%,N,New Prices Agreed £3.76

Any help would be greatly appreciated!

Thanks,

Henry

First off, I assume you mean that NEWPRICE=' ' , not FALSE , since SAS doesn't have a "FALSE" per se. ' ' would be treated as FALSE in a boolean expression, though.

COMPRESS is returning ' ' here because the value in COMMENTS has entirely letter characters. Your COMPRESS arguments are asking it to keep digits and spaces ( '' is still a single space, even if it doesn't look like it - leave the argument empty entirely if you don't want space ), meaning it would only keep spaces and digits. You have no digits in the COMMENTS field for most records, so you have only spaces, which are treated as equivalent to missing by SAS.

The other records, you have the problem that you're keeping spaces, so it's not going to turn into a number neatly. You'll want to use input , and probably not keep spaces, to get the value you want. (You also probably do want to keep . , no?) Or make NEWPRICE a character field.

Finally, your line :

NewPrice=COMPRESS(Comments, '', 'kd');

is before the input statement, which is a problem - the value for comments isn't defined yet when it runs.

This works, for example. Note I don't understand why you have NewPrice listed in input (and some other fields that won't have definitions either)...

data WORK.basefile2;


         %let _EFIERR_ = 0; /* set the ERROR detection macro variable */
         infile datalines delimiter = ',' MISSOVER DSD ;                        
            informat customer_id $8.;
            informat Name $50.;
            informat Reco_issue $50.;
            informat Reco_action $50.;
            informat ICD $50.;
            informat Start_date $50.;
            format customer_id $8.;
            format Name $50.;
            format Reco_issue $50.;
            format Reco_action $50.;
            format ICD $50.;
            format Start_date $50.;
            format Comments $255.;
            format Description $255.;

            input
            customer_id $
            Name $
            'Total Spend'n $
            Template $
            Product_id $
            Description $
            Start_date $
            CD_Sales 
            CD_Lines
            CD_Level $
            CD_Price $
            CD_uom $
            CD_Discount $
            Reco_issue $
            Reco_action $
            Reco_price $
            Reco_discount $
            Impact_Pound
            Impact
            Agree $
            Comments $
            ICD $
            Structure_Code $
            Deal_type $
            ;


            NewPrice=input(COMPRESS(Comments, '.', 'kd'),best32.);
datalines;
ASDFGH,TEST,"£31,333.00",15AH,156907,TEST,18/10/2016,"£4,003.10",222,5,£5.19,M,,Below Hard Floor,Change Rate,£6.63,,£0.48,21.72%,N,New Prices Agreed £3.76
ASDFGH,TEST,"£31,333.00",15AH,475266,TEST,11/11/2016,£49.61,29,5,£2.52,EA,,At Hard Floor,Change Rate,£6.36,,£1.28,60.38%,N,In negotiations with the customer for new prices 
ASDFGH,TEST,"£31,333.00",15AH,404740,TEST,21/09/2017,£38.69,1,5,£116.07,EA,,Below Hard Floor,Change Rate,£163.80,,£15.91,29.14%,N,In negotiations with the customer for new prices 
;;;;
           run;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM