jcushman / xport

[project has MOVED to https://github.com/selik/xport/]
MIT License
14 stars 5 forks source link

Possible issues when creating sas xport files from python #5

Open rogerjdeangelis opened 2 years ago

rogerjdeangelis commented 2 years ago

Possible issues when creating sas xport files from python

GitHub https://tinyurl.com/2p8dzn7n https://github.com/rogerjdeangelis/utl-possible-issues-when-creating-sas-xport-files-from-python

/*


/ | | | | _ | ` _ \ / _ | `| | | | _ \ || | | | | | | | | | | | (| | | | || | |/\,|| || ||| || ||\,|| _, | |/ */

Thre appears to be an issue with the V56 xport files created by the Python xport package(and pyreadstat).

Platform: SAS 9.4M7 Python 3.9 and Win`0 64bit

Gregory Warnes R SASxport is rock solid and more flexible.

I suspect the same issue exits with pyreadstat. I could not import using either package.

Here is a comparison of the differences between a python xport file and a sas created xport file with the same data

From _ Record 80 byte Card ........................XXX.....XXXXXXXX...................................XX..X SAS 2 SAS SAS SASLIB 9.4 X64_10PR 30DEC21:09:48:27 PYTHON 2 SAS SAS SASLIB 30DEC21:09:36:25

                  ........XXXXXXX.........XXX.....XXXXXXXX...................................XX..X

SAS 6 SAS SASDATA SASDATA 9.4 X64_10PR 30DEC21:09:48:27 PYTHON 6 SAS SASDATA 30DEC21:09:36:25

The python xport file can be fixed by slugging the SAS record in python records 2 and 6. If I subsitute the SAS card for the python card

Here is some code that corrects the Python xport file

filename pyx "c:/temp/example.xpt" lrecl=80 recfm=f; filename pyfix "c:/temp/examplefix.xpt" lrecl=80 recfm=f; data null; infile pyx; input lyn $char80.; select(n); when(2) substr(lyn,1,40)='SAS SAS SASLIB 9.4 X64_10PR'; when(6) substr(lyn,1,40)='SAS SASDATA SASDATA 9.4 X64_10PR'; otherwise; end; file pyfix; put lyn $char80.; run;quit;

proc fslist file=pyfix; run;quit;

/ | | (_) / | \ / ` | | | | / | / | | (| | | | | (| | | || _ \ _ \ _,|| ||_,||_, |/_|/ |__/ | | | | ____ _ _ | || | _ / _|/ | ` \ / ` |/ \ \ /\ / / _ \ |_ | | | | | _ \ / _ \| \ | (| | | | () | |) | (| | () \ V V /| | | | | |) | || | || | | | () | | | | _,|| \/| ./ _,|_/ _/_/ || || | ./ _, |_|| ||_/|| || || || |___/ /

proc datasets lib=work kill; run;quit;

%utlfkil(c:/temp/py_pgm.py); %utlfkil(c:/temp/py_pgm.log); %utlfkil(c:/temp/example.xpt);

filename ft15f001 "c:/temp/py_pgm.py"; parmcards4; import xport.v56 import pandas as pd; df = pd.DataFrame({ 'ALPHA': ['A','B' , 'C'], 'BETA': ['x', 'y', 'z'], }) ds = xport.Dataset(df) with open('c:/temp/example.xpt', 'wb') as f: xport.v56.dump(ds, f) print(df) ;;;; run;quit;

data null; file print; infile rut; input; put infile; putlog infile; run;quit;

libname pyxpt xport "c:/temp/example.xpt";

proc contents data=xpt.all; run;quit;

/* Directory

Libref XPT Engine XPORT Physical Name c:\temp\example.xpt

Member Obs, Entries

Type or Indexes Vars Label

1 DATA 0 0 */

proc datasets lib=work kill; run;quit;

data pytest; set pyxpt.sasdata; run;quit;

proc datasets lib=work kill; run;quit;

*ERROR: File PYXPT.SASDATA.DATA does not exist.;

filename pyfsl "c:/temp/sasxpt.xpt" lrecl=80 recfm=f; proc fslist file=e9; run;quit; filename pyfsl clear;

/* HEADER RECORDLIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000 SAS SAS SASLIB 9.4 X64_10PR 30DEC21:10:21:15 30DEC21:10:21:15 HEADER RECORDMEMBER HEADER RECORD!!!!!!!000000000000000001600000000140 HEADER RECORDDSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000 SAS SASDATA SASDATA 9.4 X64_10PR 30DEC21:10:21:15 30DEC21:10:21:15 HEADER RECORDNAMESTR HEADER RECORD!!!!!!!000000000200000000000000000000   ALPHA   BETA 

HEADER RECORD***OBS HEADER RECORD!!!!!!!000000000000000000000000000000 AxByCz */

/ _ _| | | | (_)__ / ` | |/ | | | | / __| / __| / __|/ _ / | | (| | | (| | | || _ \ _ \ _ \ (| _ \ _,||_,||_, |/_|/ |/_,|/ |/ /

proc datasets lib=work nodetails nolist kill; run;quit;

libname sasxpt xport "c:/temp/sasxpt.xpt";

data xpt.sasdata; ALPHA='A';BETA='x';output; ALPHA='B';BETA='y';output; ALPHA='C';BETA='z';output; run;quit;

proc contents data=xpt.all; run;quit;

/* Data Set Name XPT.SASDATA Observations . Member Type DATA Variables 2 Engine XPORT Indexes 0 Created 12/30/2021 10:21:15 Observation Length 2 Last Modified 12/30/2021 10:21:15 Deleted Observations 0 Protection Compressed NO Data Set Type Sorted NO Label Data Representation Default Encoding Default

Alphabetic List of Variables and Attributes

Variable Type Len

1 ALPHA Char 1 2 BETA Char 1 */

proc print data=sasxpt.sasdata; run;quit;

data sastst; set sasxpt.sasdata; run;quit;

/* Up to 40 obs WORK.SASTST total obs=3 30DEC2021:10:22:59

Obs ALPHA BETA

1 A x 2 B y 3 C z */

libname sasxpt clear;

filename e9 "c:/temp/sasxpt.xpt" lrecl=80 recfm=f; proc fslist file=e9; run;quit;

/* SAS Xport file HEADER RECORDLIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000 SAS SAS SASLIB 9.4 X64_10PR 30DEC21:10:21:15 30DEC21:10:21:15 HEADER RECORDMEMBER HEADER RECORD!!!!!!!000000000000000001600000000140 HEADER RECORDDSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000 SAS SASDATA SASDATA 9.4 X64_10PR 30DEC21:10:21:15 30DEC21:10:21:15 HEADER RECORDNAMESTR HEADER RECORD!!!!!!!000000000200000000000000000000   ALPHA   BETA 

HEADER RECORD***OBS HEADER RECORD!!!!!!!000000000000000000000000000000 AxByCz */

/ / ()_ _ | || | _ _ _ _ | | | || \ \/ / | _ \| | | | __| \ / | _ \ \ \/ / \ / | `| | | | |> < | |) | || | || | | | () | | | | > <| |) | () | | | | || |//\\ | ./ _, |_|| ||_/|| || //\\ ./ __/|| _| || |__/ || /

filename sasx "c:/temp/sasxpt.xpt" lrecl=80 recfm=f; data sasfyl; infile sasx ; input rec $char80.; run;quit;

filename pyx "c:/temp/example.xpt.xpt" lrecl=80 recfm=f; data pyfyl; infile "c:/temp/example.xpt" lrecl=80 recfm=f; input rec $char80.; run;quit;

proc compare data=sasfyl compare=pyfyl outnoequal out=long outbase outcompare ; run;quit;

TYPE OBS rec ........................XXX.....XXXXXXXX...................................XX..X SAS 2 SAS SAS SASLIB 9.4 X64_10PR 30DEC21:09:48:27 PYTHON 2 SAS SAS SASLIB 30DEC21:09:36:25

                  ........XXXXXXX.........XXX.....XXXXXXXX...................................XX..X

SAS 6 SAS SASDATA SASDATA 9.4 X64_10PR 30DEC21:09:48:27 PYTHON 6 SAS SASDATA 30DEC21:09:36:25

filename pyx "c:/temp/example.xpt" lrecl=80 recfm=f; filename pyfix "c:/temp/examplefix.xpt" lrecl=80 recfm=f; data null; infile pyx; input lyn $char80.; select(n); when(2) substr(lyn,1,40)='SAS SAS SASLIB 9.4 X64_10PR'; when(6) substr(lyn,1,40)='SAS SASDATA SASDATA 9.4 X64_10PR'; otherwise; end; file pyfix; put lyn $char80.; run;quit;

proc fslist file=pyfix; run;quit;

libname pyok xport "c:/temp/examplefix.xpt" ;

proc contents data=pyok.all; run;quit;

data finTst; set pyok.sasdata; run;quit;

ASCII Flatfile Ruler & Hex utlrulr c:/temp/examplefix.xpt c:\temp\delete.txt

/ / () __ | | __ | | | || \ \/ / \/ | \ \/ /_ | _| | | |> < / (| | > <| |) | | || |//__|_,| //\\ ./ _| || /

--- Record Number --- 1 --- Record Length ---- 80

HEADER RECORD***LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 44444525444542222222444545524444452544454222222233333333333333333333333333333322 8514520253F24AAAAAAAC92212908514520253F24111111100000000000000000000000000000000

--- Record Number --- 2 --- Record Length ---- 80

SAS SAS SASLIB 9.4 X64_10PR 30DEC21:09:36:25 1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 54522222545222225454442232322222533533552222222222222222222222223344433333333333 3130000031300000313C92009E400000864F10020000000000000000000000003045321A09A36A25

--- Record Number --- 3 --- Record Length ---- 80

30DEC21:09:36:25
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 33444333333333332222222222222222222222222222222222222222222222222222222222222222 3045321A09A36A250000000000000000000000000000000000000000000000000000000000000000

--- Record Number --- 4 --- Record Length ---- 80

HEADER RECORD***MEMBER HEADER RECORD!!!!!!!000000000000000001600000000140
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 44444525444542222222444445224444452544454222222233333333333333333333333333333322 8514520253F24AAAAAAAD5D252008514520253F24111111100000000000000000160000000014000

--- Record Number --- 5 --- Record Length ---- 80

HEADER RECORD***DSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 44444525444542222222454555524444452544454222222233333333333333333333333333333322 8514520253F24AAAAAAA433204208514520253F24111111100000000000000000000000000000000

--- Record Number --- 6 --- Record Length ---- 80

SAS SASDATA SASDATA 9.4 X64_10PR 30DEC21:09:36:25 1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 54522222545445425454454232322222533533552222222222222222222222223344433333333333 3130000031341410313414109E400000864F10020000000000000000000000003045321A09A36A25

--- Record Number --- 7 --- Record Length ---- 80

30DEC21:09:36:25
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 33444333333333332222222222222222222222222222222222222222222222222222222222222222 3045321A09A36A250000000000000000000000000000000000000000000000000000000000000000

--- Record Number --- 8 --- Record Length ---- 80

HEADER RECORD***NAMESTR HEADER RECORD!!!!!!!000000000200000000000000000000
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 44444525444542222222444455524444452544454222222233333333333333333333333333333322 8514520253F24AAAAAAAE1D534208514520253F24111111100000000020000000000000000000000

--- Record Number --- 9 --- Record Length ---- 80

........ALPHA ........
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 00000000445442222222222222222222222222222222222222222222222222220000000022222222 020001011C0810000000000000000000000000000000000000000000000000000000000000000000

--- Record Number --- 10 --- Record Length ---- 80

....................................................................BETA
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 00000000000000000000000000000000000000000000000000000000000000000000445422222222 00000000000000000000000000000000000000000000000000000000000002000102254100000000

--- Record Number --- 11 --- Record Length ---- 80

                                        ........        ....................

1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 22222222222222222222222222222222222222222222000000002222222200000000000000000000 00000000000000000000000000000000000000000000000000000000000000000001000000000000

--- Record Number --- 12 --- Record Length ---- 80

........................................
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 00000000000000000000000000000000000000002222222222222222222222222222222222222222 00000000000000000000000000000000000000000000000000000000000000000000000000000000

--- Record Number --- 13 --- Record Length ---- 80

HEADER RECORD***OBS HEADER RECORD!!!!!!!000000000000000000000000000000
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 44444525444542222222445222224444452544454222222233333333333333333333333333333322 8514520253F24AAAAAAAF23000008514520253F24111111100000000000000000000000000000000

--- Record Number --- 14 --- Record Length ---- 80

AxByCz
1...5....10...15...20...25...30...35...40...45...50...55...60...65...70...75...8 47474722222222222222222222222222222222222222222222222222222222222222222222222222 18293A00000000000000000000000000000000000000000000000000000000000000000000000000