+
    xȇi:              	      ,   R t ^ RIHt ^ RIHt ^ RIt^ RIHt ^ RIt^ RIt	^ RI
Ht ^ RIt^ RIHt ^ RIHt ]'       d   ^ RIHtHtHtHt R	tR
tRtRt. ROtRtRtRtRtR] R] R] R] R2	t R] R] R2t!R R lt"R R lt#R t$R t% ! R R]4      t&R# )a-  
Read a SAS XPort format file into a Pandas DataFrame.

Based on code from Jack Cushman (github.com/jcushman/xport).

The file format is defined here:

https://support.sas.com/content/dam/SAS/support/en/technical-papers/record-layout-of-a-sas-version-5-or-6-data-set-in-sas-transport-xport-format.pdf
)annotations)datetimeN)TYPE_CHECKING)find_stack_level)
get_handle)	SASReader)CompressionOptionsDatetimeNaTTypeFilePath
ReadBufferzPHEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000  zKHEADER RECORD*******MEMBER  HEADER RECORD!!!!!!!000000000000000001600000000zPHEADER RECORD*******DSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000  zPHEADER RECORD*******OBS     HEADER RECORD!!!!!!!000000000000000000000000000000  zParameters
----------
filepath_or_buffer : str or file-like object
    Path to SAS file or object implementing binary read method.zindex : identifier of index column
    Identifier of column that should be used as index of the DataFrame.
encoding : str
    Encoding for text data.
chunksize : int
    Read file `chunksize` lines at a time, returns iterator.zBformat : str
    File format, only `xport` is currently supported.z\iterator : bool, default False
    Return XportReader object for reading file incrementally.z#Read a SAS file into a DataFrame.


a  

Returns
-------
DataFrame or XportReader

Examples
--------
Read a SAS Xport file:

>>> df = pd.read_sas('filename.XPT')

Read a Xport file in 10,000 line chunks:

>>> itr = pd.read_sas('filename.XPT', chunksize=10000)
>>> for chunk in itr:
>>>     do_something(chunk)

z$Class for reading SAS Xport files.

z

Attributes
----------
member_info : list
    Contains information about the file
fields : list
    Contains information about the variables in the file
c                    V ^8  d   QhRRRR/# )   datestrstrreturnr	    )formats   "g/Users/max/.openclaw/workspace/postharvest/venv/lib/python3.14/site-packages/pandas/io/sas/sas_xport.py__annotate__r      s            c                t     \         P                  ! V R4      #   \         d    \        P                  u # i ; i)z1Given a date in xport format, return Python date.z%d%b%y:%H:%M:%S)r   strptime
ValueErrorpdNaT)r   s   &r   _parse_dater      s3      *;<< vvs    77c                   V ^8  d   QhRR/# )r   sr   r   )r   s   "r   r   r      s      3 r   c                n    / p^ pV F'  w  rEWW5,            P                  4       W$&   W5,          pK)  	  VR V# )z
Parameters
----------
s: str
    Fixed-length string to split
parts: list of (name, length) pairs
    Used to break up string, name '_' will be filtered from output.

Returns
-------
Dict of name:contents of string at given location.
_)strip)r   partsoutstartnamelengths   &&    r   _split_liner'      sF     CEen-335	  	CJr   c                    V^8w  dp   \         P                  ! \        V 4      \         P                  ! R4      4      p\         P                  ! RV R^V,
           24      pVP	                  VR7      pWR&   V# V # )   S8Sz,Sdtypef0)npzeroslenr-   view)vecnbytesvec1r-   vec2s   &&   r   _handle_truncated_float_vecr7      sg     {xxC"((4.11VHBq6zl34yyuy%T
Jr   c                J   \         P                  ! R4      pV P                  VR7      pVR,          pVR,          pVR,          p\         P                  ! \	        V 4      \         P
                  R7      p^V\         P                  ! VR,          4      &   ^V\         P                  ! VR,          4      &   ^V\         P                  ! VR,          4      &   WV,          pWF,	          V^,          ^^V,
          ,           ,          ,          pVR	,          pWS^,	          ^,          ^A,
          ^,          V,           R
,           ^,          VR,          ,          ,          p\         P                  ! \	        V4      3RR7      pWXR&   WxR&   VP                  RR7      pVP                  R4      pV# )zZ
Parse a vector of float values representing IBM 8 byte floats into
native 8 byte floats.
z>u4,>u4r,   r.   f1i i    i  @ i   l    i  l        z>f8f8)	r/   r-   r2   r0   r1   uint8whereemptyastype)	r3   r-   r5   xport1xport2ieee1shiftieee2ieees	   &        r   _parse_float_vecrE      sZ   
 HHYE88%8 D$ZF$ZF ZE HHSXRXX.E+,E"((6J&
'(+,E"((6J&
'(+,E"((6J&
'( 
OE_&:"52U;K!LME 
ZE 
R<4'2-!3u<tCJ E 88SZM3DJJ9959!D;;tDKr   c                      ] tR t^t]tRR R lltR R ltR tR R lt	R	 R
 lt
R R ltRR R lltR tRR R lltRtR# )XportReaderNc          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r   filepath_or_bufferzFilePath | ReadBuffer[bytes]encodingz
str | None	chunksize
int | Nonecompressionr   r   Noner   )r   s   "r   r   XportReader.__annotate__   s<      8 	
  ( 
r   c                	    W0n         ^ V n        W n        W@n        \	        VRVRVR7      V n        V P
                  P                  V n         V P                  4        R#   \         d    T P                  4        h i ; i)    rbF)rJ   is_textrM   N)	_encoding_lines_read_index
_chunksizer   handleshandlerI   _read_header	Exceptionclose)selfrI   indexrJ   rK   rM   s   &&&&&&r   __init__XportReader.__init__   sv     "#!#
 #',,"5"5	 	JJL	s   A A:c                   V ^8  d   QhRR/# r   r   rN   r   )r   s   "r   r   rO     s      t r   c                	:    V P                   P                  4        R # N)rX   r\   r]   s   &r   r\   XportReader.close  s    r   c                	T    V P                   P                  ^P4      P                  4       # )P   )rI   readdecodere   s   &r   _get_rowXportReader._get_row  s"    &&++B/6688r   c                   V ^8  d   QhRR/# rb   r   )r   s   "r   r   rO     s     l ld lr   c           
     	   V P                   P                  ^ 4       V P                  4       pV\        8w  d   RV9   d   \	        R4      h\	        R4      hV P                  4       pR^.R^.R^.R^.R^..p\        W#4      pVR,          R	8w  d   \	        R
4      h\        VR,          4      VR&   W@n        V P                  4       p\        VR,          4      VR&   V P                  4       pV P                  4       pVP                  \        4      pV\        8H  p	V'       d	   V	'       g   \	        R4      h\        VR!R" 4      p
R^.R^.R^.R^.R^.R^.R^..p\        V P                  4       V4      pR^.R^.R^(.R^..pVP                  \        V P                  4       V4      4       \        VR,          4      VR&   \        VR,          4      VR&   Wn        ^R^R/p\        V P                  4       R,          4      pW,          pV^P,          '       d   V^PV^P,          ,
          ,          pV P                   P                  V4      p. p^ p\        V4      V
8  d   VRV
 VV
R ppVP!                  ^4      p\"        P$                  ! RV4      p\'        \)        \*        VRR7      4      pVR VVR,          ,          VR&   VR,          pVR,          R8X  d    V^8  g   V^8  d   RV R2p\-        V4      hVP/                  4        F  w  pp VP1                  4       VV&   K  	  VVR,          ,          pVV.,          pK  V P                  4       pV\4        8X  g   \	        R4      hVV n        VV n        V P                   P;                  4       V n        V P?                  4       V n         V P6                   Uu. uF  pVR,          PC                  4       NK  	  upV n"        \G        V P6                  4       UUu. uF1  w  ppR\I        V4      ,           R \I        VR,          4      ,           3NK3  	  ppp\J        PL                  ! V4      pVV n'        R#   \2         d     EKX  i ; iu upi u uppi )#rQ   z**COMPRESSED**z<Header record indicates a CPORT file, which is not readable.z#Header record is not an XPORT file.prefixversionOSr    createdzSAS     SAS     SASLIBz!Header record has invalid prefix.:N   NmodifiedzMember header not foundset_namesasdatalabeltypenumericchar:6   :   NNz>hhhh8s40s8shhh2s8shhl52sT)strictntypefield_lengthzFloating field width z is not between 2 and 8.zObservation header not found.r%   r   r+   )(rI   seekrk   _correct_line1r   r'   r   	file_info
startswith_correct_header1_correct_header2intupdatemember_infori   r1   ljuststructunpackdictzip
_fieldkeys	TypeErroritemsr!   AttributeError_correct_obs_headerfieldsrecord_lengthtellrecord_start_record_countnobsrj   columns	enumerater   r/   r-   _dtype)r]   line1line2fifr   line3header1header2	headflag1	headflag2fieldnamelengthmemr   types
fieldcount
datalength	fielddatar   
obs_length
fieldbytesfieldstructfieldflmsgkvheaderxidtypelr-   s   &                              r   rZ   XportReader._read_header  sI   $$Q' N"5( !R  BCC"~	1~ay3)iQS_U+	X"::@AA*9Y+?@	)" +E#J 7	* --/--/&&'78	//	i677gbn- qMONN1I"IO
 "$--/37B#rWbMFA;G;t}}<="-k*.E"FJ!,[-C!DI& Iq&)/0
$1
??"zB..J++00<	
)n/ *?+/*+ "J $))#.J --(CZPKZTBCEc
"5>2E'N~&BW~*aR!V-bT1IJn$1 wwyE!H & %//JugF,,<==' 3388:&&(	48KK@Kq&	((*K@
 &dkk2
25 3q6\3U>%:!;;<2 	 
  / &  A
s   Q4 Q 47Q%QQc                   V ^8  d   QhRR/# )r   r   pd.DataFramer   )r   s   "r   r   rO     s     5 5, 5r   c                	N    T P                  V P                  ;'       g    ^R7      # )   nrows)ri   rW   re   s   &r   __next__XportReader.__next__  s    yyt33!y44r   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r   r   rO     s     $G $Gs $Gr   c                .   V P                   P                  ^ ^4       V P                   P                  4       V P                  ,
          pV^P,          ^ 8w  d!   \        P
                  ! R\        4       R7       V P                  ^P8  d8   V P                   P                  V P                  4       WP                  ,          # V P                   P                  R^4       V P                   P                  ^P4      p\        P                  ! V\        P                  R7      p\        P                  ! VR8H  4      p\        V4      ^ 8X  d   ^ pM^\        V4      ,          pV P                   P                  V P                  4       W,
          V P                  ,          # )z
Get number of records in file.

This is maybe suboptimal because we have to seek to the end of
the file.

Side effect: returns file position to record_start.
zxport file may be corrupted.)
stacklevelr,   l     @@  i)rI   r   r   r   warningswarnr   r   ri   r/   
frombufferuint64flatnonzeror1   )r]   total_records_lengthlast_card_bytes	last_cardixtail_pads   &     r   r   XportReader._record_count  s6    	$$Q*#66;;=@Q@QQ"$)MM.+-
 "##(():):;'+=+===$$S!,1166r:MM/C	 ^^I)<<=r7a<H3r7{H$$T%6%67$/D4F4FFFr   c                    V ^8  d   QhRRRR/# )r   sizerL   r   r   r   )r   s   "r   r   rO     s     % %j %L %r   c                F    Vf   V P                   pV P                  VR7      # )z
Reads lines from Xport file and returns as dataframe

Parameters
----------
size : int, defaults to None
    Number of lines to read.  If None, reads whole file.

Returns
-------
DataFrame
r   )rW   ri   )r]   r   s   &&r   	get_chunkXportReader.get_chunk  s#     <??Dyyty$$r   c                	   VP                  R R7      pVR,          ^ 8H  VR,          ^ 8H  ,          VR,          ^ 8H  ,          pVR,          ^A8  VR,          ^Z8*  ,          VR,          ^_8H  ,          VR,          ^.8H  ,          pW4,          pV# )zu1,u1,u2,u4r,   r9   f2f3r.   )r2   )r]   r3   r   missmiss1s   &&   r   _missing_doubleXportReader._missing_double  s    HH=H)$14A.!D'Q,?go!D'T/2w$ w$  	
 	r   c                    V ^8  d   QhRRRR/# )r   r   rL   r   r   r   )r   s   "r   r   rO     s     1 1* 1 1r   c                   Vf   V P                   p\        WP                   V P                  ,
          4      pW P                  ,          pV^ 8:  d   V P	                  4        \
        hV P                  P                  V4      p\        P                  ! W@P                  VR7      p/ p\        V P                  4       EF  w  rxVR\        V4      ,           ,          p	V P                  V,          R,          p
V
R8X  dS   \        WP                  V,          R,          4      p	V P!                  V	4      p\#        V	4      p\        P$                  W&   MtV P                  V,          R,          R8X  dV   V	 Uu. uF  qP'                  4       NK  	  ppV P(                  e*   V Uu. uF  qP+                  V P(                  4      NK  	  ppVP-                  VX/4       EK  	  \.        P0                  ! V4      pV P2                  fB   \.        P4                  ! \7        V P                  V P                  V,           4      4      Vn        MVP;                  V P2                  4      pV ;P                  V,          un        V# u upi u upi )zRead observations from SAS Xport file, returning as data frame.

Parameters
----------
nrows : int
    Number of rows to read from data file; if None, read whole
    file.

Returns
-------
A DataFrame.
)r-   countr   r~   ry   r   rz   )r   minrU   r   r\   StopIterationrI   ri   r/   r   r   r   r   r   r   r7   r   rE   nanrstriprT   rj   r   r   	DataFramerV   Indexranger^   	set_index)r]   r   
read_linesread_lenrawdatadf_datajr   r3   r~   r   r   ydfs   &&             r   ri   XportReader.read  s    =IIE		D,<,< <=
 2 22q=JJL%%**84}}S:Fdll+DAsSV|$CKKN7+E	!1#{{1~n7UV++C0$S)&&Q(F2),-AXXZ->>-;<=1a$..11A=NNAq6" , \\'";;xxd&6&68H8H:8U VWBHdkk*BJ&	 . >s   /I3#I8)rW   r   rT   rV   rU   r   r   r   rI   rX   r   r   r   r   )Nz
ISO-8859-1Ninferrd   )__name__
__module____qualname____firstlineno___xport_reader_doc__doc__r_   r\   rk   rZ   r   r   r   r   ri   __static_attributes__r   r   r   rG   rG      s=    G89l\5$GL%"	1 1r   rG   )r~   nhfunr   nvar0r%   rw   nformnflnum_decimalsnfjnfillniformniflnifdnposr    )'r   
__future__r   r   r   typingr   r   numpyr/   pandas.util._exceptionsr   pandasr   pandas.io.commonr   pandas.io.sas.sasreaderr   pandas._typingr   r	   r
   r   r   r   r   r   r   _base_params_doc_params2_doc_format_params_doc_iterator_doc_read_sas_docr   r   r'   r7   rE   rG   r   r   r   <module>r     s   #       4  ' -  W  R  W  W 
(C @9 A
      2    	 ,&6rI) Ir   