From e616bc940ff4b1a1c7e9b4fe0ac068c7295f368c Mon Sep 17 00:00:00 2001 From: ^ Date: Fri, 23 Feb 2024 10:26:01 +0000 Subject: [PATCH 1/2] fix: partial short numeric support in mp_ds2csv --- base/mp_ds2csv.sas | 11 ++++- ...p_ds2csv.test.sas => mp_ds2csv.test.1.sas} | 0 tests/base/mp_ds2csv.test.2.sas | 43 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) rename tests/base/{mp_ds2csv.test.sas => mp_ds2csv.test.1.sas} (100%) create mode 100644 tests/base/mp_ds2csv.test.2.sas diff --git a/base/mp_ds2csv.sas b/base/mp_ds2csv.sas index 17c005a..f5cfcc2 100644 --- a/base/mp_ds2csv.sas +++ b/base/mp_ds2csv.sas @@ -118,13 +118,21 @@ data _null_; header = cats(coalescec(varlabel(dsid,i),varnm),dlm); %end; %else %if &headerformat=SASJS %then %do; - if vartype(dsid,i)='C' then header=cats(varnm,':$char',varlen(dsid,i),'.'); + vlen=varlen(dsid,i); + if vartype(dsid,i)='C' then header=cats(varnm,':$char',vlen,'.'); else do; vfmt=coalescec(varfmt(dsid,i),'0'); fmttype=mcf_getfmttype(vfmt); if fmttype='DATE' then header=cats(varnm,':date9.'); else if fmttype='DATETIME' then header=cats(varnm,':E8601DT26.6'); else if fmttype='TIME' then header=cats(varnm,':TIME12.'); + /** + * there is not much point importing a short length numeric like this, + * eg with best4., as the resulting variable will still be stored as + * length 8. We need a length or format statement to ensure variable + * is creatd with the smaller length... + **/ + else if vlen<8 then header=cats(varnm,':best',vlen,'.'); else header=cats(varnm,':best.'); end; %end; @@ -151,6 +159,7 @@ data _null_; set &ds end=last; %do i=1 %to &vcnt; %let var=%scan(&varlist,&i); + %local vlen&i; %if %mf_getvartype(&ds,&var)=C %then %do; %let dsv1=%mf_getuniquename(prefix=csvcol1_); %let dsv2=%mf_getuniquename(prefix=csvcol2_); diff --git a/tests/base/mp_ds2csv.test.sas b/tests/base/mp_ds2csv.test.1.sas similarity index 100% rename from tests/base/mp_ds2csv.test.sas rename to tests/base/mp_ds2csv.test.1.sas diff --git a/tests/base/mp_ds2csv.test.2.sas b/tests/base/mp_ds2csv.test.2.sas new file mode 100644 index 0000000..a9edf0f --- /dev/null +++ b/tests/base/mp_ds2csv.test.2.sas @@ -0,0 +1,43 @@ +/** + @file + @brief Testing mp_ds2csv.sas macro + +

SAS Macros

+ @li mp_ds2csv.sas + @li mp_assert.sas + @li mp_assertscope.sas + +**/ + +data work.shortnum; + length a 3 b 4 c 8; + a=1;b=2;c=3; + output; + stop; +run; + +/** + * Test 1 - default CSV + */ + +%mp_ds2csv(work.shortnum,outfile="&sasjswork/test1.csv",headerformat=SASJS) + +%let test1b=FAIL; +data _null_; + infile "&sasjswork/test1.csv"; + input; + list; + if _n_=1 then call symputx('test1a',_infile_); + else if _infile_=:'1,2,3' then call symputx('test1b','PASS'); +run; + +%mp_assert( + iftrue=("&test1a"="A:best3. B:best4. C:best."), + desc=Checking header row Test 1, + outds=work.test_results +) +%mp_assert( + iftrue=("&test1b"="PASS"), + desc=Checking data row Test 1, + outds=work.test_results +) From 92f575551d073d8037c8fe9ef191596993e64e2d Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 23 Feb 2024 10:26:33 +0000 Subject: [PATCH 2/2] chore: updating all.sas --- all.sas | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/all.sas b/all.sas index 87abdc5..46f5644 100644 --- a/all.sas +++ b/all.sas @@ -5541,13 +5541,21 @@ data _null_; header = cats(coalescec(varlabel(dsid,i),varnm),dlm); %end; %else %if &headerformat=SASJS %then %do; - if vartype(dsid,i)='C' then header=cats(varnm,':$char',varlen(dsid,i),'.'); + vlen=varlen(dsid,i); + if vartype(dsid,i)='C' then header=cats(varnm,':$char',vlen,'.'); else do; vfmt=coalescec(varfmt(dsid,i),'0'); fmttype=mcf_getfmttype(vfmt); if fmttype='DATE' then header=cats(varnm,':date9.'); else if fmttype='DATETIME' then header=cats(varnm,':E8601DT26.6'); else if fmttype='TIME' then header=cats(varnm,':TIME12.'); + /** + * there is not much point importing a short length numeric like this, + * eg with best4., as the resulting variable will still be stored as + * length 8. We need a length or format statement to ensure variable + * is creatd with the smaller length... + **/ + else if vlen<8 then header=cats(varnm,':best',vlen,'.'); else header=cats(varnm,':best.'); end; %end; @@ -5574,6 +5582,7 @@ data _null_; set &ds end=last; %do i=1 %to &vcnt; %let var=%scan(&varlist,&i); + %local vlen&i; %if %mf_getvartype(&ds,&var)=C %then %do; %let dsv1=%mf_getuniquename(prefix=csvcol1_); %let dsv2=%mf_getuniquename(prefix=csvcol2_);