From 5552817ed1df77ec9f7bf564cbb73d4c07882928 Mon Sep 17 00:00:00 2001 From: Kerby Shedden Date: Sun, 10 Jan 2016 16:13:07 -0500 Subject: [PATCH] Support for reading SAS7BDAT files Working version except for compression reorganized directory structure Added license file for Jared Hobbs code RLE decompression use ndarray instead of bytes RDC decompression Fix byte order swapping fix rebase errors in test_xport Use filepath_or_buffer io function Handle alilgnment correction Revamped testing Add test with unicode strings Add minimal encoding detection Refactor row-processing Add missing test file Unclobber test files Try again to revert accidental changes to test data files Minor changes in response to code review Add SAS benchmarks to ASV Stash changes before rebase refactor following code review Updated io and whatsnew Updates following code review Remove local test modifications Minor changes following code review Remove unwanted test data file Mostly formatting changes following code review Remove two unneeded files Add __init__py --- LICENSES/SAS7BDAT_LICENSE | 19 + asv_bench/benchmarks/packers.py | 20 +- doc/source/io.rst | 29 +- doc/source/whatsnew/v0.18.0.txt | 7 + pandas/io/api.py | 2 +- pandas/io/sas/__init__.py | 0 pandas/io/sas/sas7bdat.py | 828 ++++++++++++++++++ pandas/io/{sas.py => sas/sas_xport.py} | 74 +- pandas/io/sas/saslib.pyx | 237 +++++ pandas/io/sas/sasreader.py | 61 ++ pandas/io/tests/{ => sas}/data/DEMO_G.csv | 0 pandas/io/tests/{ => sas}/data/DEMO_G.xpt | Bin pandas/io/tests/{ => sas}/data/DRXFCD_G.csv | 0 pandas/io/tests/{ => sas}/data/DRXFCD_G.xpt | Bin pandas/io/tests/{ => sas}/data/SSHSV1_A.csv | 0 pandas/io/tests/{ => sas}/data/SSHSV1_A.xpt | Bin .../tests/{ => sas}/data/paxraw_d_short.csv | 0 .../tests/{ => sas}/data/paxraw_d_short.xpt | Bin pandas/io/tests/sas/data/test1.sas7bdat | Bin 0 -> 131072 bytes pandas/io/tests/sas/data/test10.sas7bdat | Bin 0 -> 131072 bytes pandas/io/tests/sas/data/test11.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test12.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test13.sas7bdat | Bin 0 -> 131072 bytes pandas/io/tests/sas/data/test14.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test15.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test16.sas7bdat | Bin 0 -> 73728 bytes pandas/io/tests/sas/data/test2.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test3.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test4.sas7bdat | Bin 0 -> 131072 bytes pandas/io/tests/sas/data/test5.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test6.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test7.sas7bdat | Bin 0 -> 131072 bytes pandas/io/tests/sas/data/test8.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test9.sas7bdat | Bin 0 -> 196608 bytes pandas/io/tests/sas/data/test_sas7bdat_1.csv | 11 + pandas/io/tests/sas/data/test_sas7bdat_2.csv | 11 + pandas/io/tests/sas/test_sas7bdat.py | 64 ++ .../tests/{test_sas.py => sas/test_xport.py} | 43 +- setup.py | 8 +- 39 files changed, 1325 insertions(+), 89 deletions(-) create mode 100644 LICENSES/SAS7BDAT_LICENSE create mode 100644 pandas/io/sas/__init__.py create mode 100644 pandas/io/sas/sas7bdat.py rename pandas/io/{sas.py => sas/sas_xport.py} (86%) create mode 100644 pandas/io/sas/saslib.pyx create mode 100644 pandas/io/sas/sasreader.py rename pandas/io/tests/{ => sas}/data/DEMO_G.csv (100%) rename pandas/io/tests/{ => sas}/data/DEMO_G.xpt (100%) rename pandas/io/tests/{ => sas}/data/DRXFCD_G.csv (100%) rename pandas/io/tests/{ => sas}/data/DRXFCD_G.xpt (100%) rename pandas/io/tests/{ => sas}/data/SSHSV1_A.csv (100%) rename pandas/io/tests/{ => sas}/data/SSHSV1_A.xpt (100%) rename pandas/io/tests/{ => sas}/data/paxraw_d_short.csv (100%) rename pandas/io/tests/{ => sas}/data/paxraw_d_short.xpt (100%) create mode 100644 pandas/io/tests/sas/data/test1.sas7bdat create mode 100644 pandas/io/tests/sas/data/test10.sas7bdat create mode 100644 pandas/io/tests/sas/data/test11.sas7bdat create mode 100644 pandas/io/tests/sas/data/test12.sas7bdat create mode 100644 pandas/io/tests/sas/data/test13.sas7bdat create mode 100644 pandas/io/tests/sas/data/test14.sas7bdat create mode 100644 pandas/io/tests/sas/data/test15.sas7bdat create mode 100644 pandas/io/tests/sas/data/test16.sas7bdat create mode 100644 pandas/io/tests/sas/data/test2.sas7bdat create mode 100644 pandas/io/tests/sas/data/test3.sas7bdat create mode 100644 pandas/io/tests/sas/data/test4.sas7bdat create mode 100644 pandas/io/tests/sas/data/test5.sas7bdat create mode 100644 pandas/io/tests/sas/data/test6.sas7bdat create mode 100644 pandas/io/tests/sas/data/test7.sas7bdat create mode 100644 pandas/io/tests/sas/data/test8.sas7bdat create mode 100644 pandas/io/tests/sas/data/test9.sas7bdat create mode 100644 pandas/io/tests/sas/data/test_sas7bdat_1.csv create mode 100644 pandas/io/tests/sas/data/test_sas7bdat_2.csv create mode 100644 pandas/io/tests/sas/test_sas7bdat.py rename pandas/io/tests/{test_sas.py => sas/test_xport.py} (73%) diff --git a/LICENSES/SAS7BDAT_LICENSE b/LICENSES/SAS7BDAT_LICENSE new file mode 100644 index 0000000000000..8fbf194013e93 --- /dev/null +++ b/LICENSES/SAS7BDAT_LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Jared Hobbs + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/asv_bench/benchmarks/packers.py b/asv_bench/benchmarks/packers.py index 12e48295d8d05..74bec72eb05e9 100644 --- a/asv_bench/benchmarks/packers.py +++ b/asv_bench/benchmarks/packers.py @@ -318,6 +318,24 @@ def remove(self, f): pass +class packers_read_sas7bdat(object): + + def setup(self): + self.f = 'data/test1.sas7bdat' + + def time_packers_read_sas7bdat(self): + pd.read_sas(self.f, format='sas7bdat') + + +class packers_read_xport(object): + + def setup(self): + self.f = 'data/paxraw_d_short.xpt' + + def time_packers_read_xport(self): + pd.read_sas(self.f, format='xport') + + class packers_write_csv(object): goal_time = 0.2 @@ -854,4 +872,4 @@ def remove(self, f): try: os.remove(self.f) except: - pass \ No newline at end of file + pass diff --git a/doc/source/io.rst b/doc/source/io.rst index 577d6b34ec719..ca83128bc6c81 100644 --- a/doc/source/io.rst +++ b/doc/source/io.rst @@ -4564,24 +4564,25 @@ easy conversion to and from pandas. .. _io.sas_reader: -SAS Format ----------- +SAS Formats +----------- .. versionadded:: 0.17.0 -The top-level function :func:`read_sas` currently can read (but -not write) SAS xport (.XPT) format files. Pandas cannot currently -handle SAS7BDAT files. +The top-level function :func:`read_sas` can read (but not write) SAS +`xport` (.XPT) and `SAS7BDAT` (.sas7bdat) format files. -XPORT files only contain two value types: ASCII text and double -precision numeric values. There is no automatic type conversion to -integers, dates, or categoricals. By default the whole file is read -and returned as a ``DataFrame``. +SAS files only contain two value types: ASCII text and floating point +values (usually 8 bytes but sometimes truncated). For xport files, +there is no automatic type conversion to integers, dates, or +categoricals. For SAS7BDAT files, the format codes may allow date +variables to be automatically converted to dates. By default the +whole file is read and returned as a ``DataFrame``. -Specify a ``chunksize`` or use ``iterator=True`` to obtain an -``XportReader`` object for incrementally reading the file. The -``XportReader`` object also has attributes that contain additional -information about the file and its variables. +Specify a ``chunksize`` or use ``iterator=True`` to obtain reader +objects (``XportReader`` or ``SAS7BDATReader``) for incrementally +reading the file. The reader objects also have attributes that +contain additional information about the file and its variables. Read a SAS XPORT file: @@ -4602,6 +4603,8 @@ web site. .. _specification: https://support.sas.com/techsup/technote/ts140.pdf +No official documentation is available for the SAS7BDAT format. + .. _io.perf: Performance Considerations diff --git a/doc/source/whatsnew/v0.18.0.txt b/doc/source/whatsnew/v0.18.0.txt index e944189e2a338..31415e17244e2 100644 --- a/doc/source/whatsnew/v0.18.0.txt +++ b/doc/source/whatsnew/v0.18.0.txt @@ -403,6 +403,13 @@ For example, if you have a jupyter notebook you plan to convert to latex using n Options ``display.latex.escape`` and ``display.latex.longtable`` have also been added to the configuration and are used automatically by the ``to_latex`` method. See the :ref:`options documentation` for more info. +SAS7BDAT files +^^^^^^^^^^^^^^ + +Pandas can now read SAS7BDAT files, including compressed files. The +files can be read in entirety, or incrementally. For full details see +:ref:`here `. (issue:`4052`) + .. _whatsnew_0180.enhancements.other: Other enhancements diff --git a/pandas/io/api.py b/pandas/io/api.py index 3ac4c670c8466..920ece9c4c3a8 100644 --- a/pandas/io/api.py +++ b/pandas/io/api.py @@ -11,7 +11,7 @@ from pandas.io.json import read_json from pandas.io.html import read_html from pandas.io.sql import read_sql, read_sql_table, read_sql_query -from pandas.io.sas import read_sas +from pandas.io.sas.sasreader import read_sas from pandas.io.stata import read_stata from pandas.io.pickle import read_pickle, to_pickle from pandas.io.packers import read_msgpack, to_msgpack diff --git a/pandas/io/sas/__init__.py b/pandas/io/sas/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/pandas/io/sas/sas7bdat.py b/pandas/io/sas/sas7bdat.py new file mode 100644 index 0000000000000..e068c51df585d --- /dev/null +++ b/pandas/io/sas/sas7bdat.py @@ -0,0 +1,828 @@ +""" +Read SAS7BDAT files + +Based on code written by Jared Hobbs: + https://bitbucket.org/jaredhobbs/sas7bdat + +See also: + https://github.com/BioStatMatt/sas7bdat + +Partial documentation of the file format: + https://cran.r-project.org/web/packages/sas7bdat/vignettes/sas7bdat.pdf + +Reference for binary data compression: + http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/1992/9210/ross/ross.htm +""" + +import pandas as pd +from pandas import compat +from pandas.io.common import get_filepath_or_buffer, BaseIterator +import numpy as np +import struct +from .saslib import (_rle_decompress, _rdc_decompress, + process_byte_array_with_data) + +_magic = (b"\x00\x00\x00\x00\x00\x00\x00\x00" + + b"\x00\x00\x00\x00\xc2\xea\x81\x60" + + b"\xb3\x14\x11\xcf\xbd\x92\x08\x00" + + b"\x09\xc7\x31\x8c\x18\x1f\x10\x11") + +_align_1_checker_value = b'3' +_align_1_offset = 32 +_align_1_length = 1 +_align_1_value = 4 +_u64_byte_checker_value = b'3' +_align_2_offset = 35 +_align_2_length = 1 +_align_2_value = 4 +_endianness_offset = 37 +_endianness_length = 1 +_platform_offset = 39 +_platform_length = 1 +_encoding_offset = 70 +_encoding_length = 1 +_dataset_offset = 92 +_dataset_length = 64 +_file_type_offset = 156 +_file_type_length = 8 +_date_created_offset = 164 +_date_created_length = 8 +_date_modified_offset = 172 +_date_modified_length = 8 +_header_size_offset = 196 +_header_size_length = 4 +_page_size_offset = 200 +_page_size_length = 4 +_page_count_offset = 204 +_page_count_length = 4 +_sas_release_offset = 216 +_sas_release_length = 8 +_sas_server_type_offset = 224 +_sas_server_type_length = 16 +_os_version_number_offset = 240 +_os_version_number_length = 16 +_os_maker_offset = 256 +_os_maker_length = 16 +_os_name_offset = 272 +_os_name_length = 16 +_page_bit_offset_x86 = 16 +_page_bit_offset_x64 = 32 +_subheader_pointer_length_x86 = 12 +_subheader_pointer_length_x64 = 24 +_page_type_offset = 0 +_page_type_length = 2 +_block_count_offset = 2 +_block_count_length = 2 +_subheader_count_offset = 4 +_subheader_count_length = 2 +_page_meta_type = 0 +_page_data_type = 256 +_page_amd_type = 1024 +_page_metc_type = 16384 +_page_comp_type = -28672 +_page_mix_types = [512, 640] +_subheader_pointers_offset = 8 +_truncated_subheader_id = 1 +_compressed_subheader_id = 4 +_compressed_subheader_type = 1 +_text_block_size_length = 2 +_row_length_offset_multiplier = 5 +_row_count_offset_multiplier = 6 +_col_count_p1_multiplier = 9 +_col_count_p2_multiplier = 10 +_row_count_on_mix_page_offset_multiplier = 15 +_column_name_pointer_length = 8 +_column_name_text_subheader_offset = 0 +_column_name_text_subheader_length = 2 +_column_name_offset_offset = 2 +_column_name_offset_length = 2 +_column_name_length_offset = 4 +_column_name_length_length = 2 +_column_data_offset_offset = 8 +_column_data_length_offset = 8 +_column_data_length_length = 4 +_column_type_offset = 14 +_column_type_length = 1 +_column_format_text_subheader_index_offset = 22 +_column_format_text_subheader_index_length = 2 +_column_format_offset_offset = 24 +_column_format_offset_length = 2 +_column_format_length_offset = 26 +_column_format_length_length = 2 +_column_label_text_subheader_index_offset = 28 +_column_label_text_subheader_index_length = 2 +_column_label_offset_offset = 30 +_column_label_offset_length = 2 +_column_label_length_offset = 32 +_column_label_length_length = 2 +_rle_compression = 'SASYZCRL' +_rdc_compression = 'SASYZCR2' + +_compression_literals = [_rle_compression, _rdc_compression] + +# Incomplete list of encodings +_encoding_names = {29: "latin1", 20: "utf-8", 33: "cyrillic", 60: "wlatin2", + 61: "wcyrillic", 62: "wlatin1", 90: "ebcdic870"} + +# Should be enum + + +class _index: + rowSizeIndex = 0 + columnSizeIndex = 1 + subheaderCountsIndex = 2 + columnTextIndex = 3 + columnNameIndex = 4 + columnAttributesIndex = 5 + formatAndLabelIndex = 6 + columnListIndex = 7 + dataSubheaderIndex = 8 + + +_subheader_signature_to_index = { + b"\xF7\xF7\xF7\xF7": _index.rowSizeIndex, + b"\x00\x00\x00\x00\xF7\xF7\xF7\xF7": _index.rowSizeIndex, + b"\xF7\xF7\xF7\xF7\x00\x00\x00\x00": _index.rowSizeIndex, + b"\xF7\xF7\xF7\xF7\xFF\xFF\xFB\xFE": _index.rowSizeIndex, + b"\xF6\xF6\xF6\xF6": _index.columnSizeIndex, + b"\x00\x00\x00\x00\xF6\xF6\xF6\xF6": _index.columnSizeIndex, + b"\xF6\xF6\xF6\xF6\x00\x00\x00\x00": _index.columnSizeIndex, + b"\xF6\xF6\xF6\xF6\xFF\xFF\xFB\xFE": _index.columnSizeIndex, + b"\x00\xFC\xFF\xFF": _index.subheaderCountsIndex, + b"\xFF\xFF\xFC\x00": _index.subheaderCountsIndex, + b"\x00\xFC\xFF\xFF\xFF\xFF\xFF\xFF": _index.subheaderCountsIndex, + b"\xFF\xFF\xFF\xFF\xFF\xFF\xFC\x00": _index.subheaderCountsIndex, + b"\xFD\xFF\xFF\xFF": _index.columnTextIndex, + b"\xFF\xFF\xFF\xFD": _index.columnTextIndex, + b"\xFD\xFF\xFF\xFF\xFF\xFF\xFF\xFF": _index.columnTextIndex, + b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFD": _index.columnTextIndex, + b"\xFF\xFF\xFF\xFF": _index.columnNameIndex, + b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF": _index.columnNameIndex, + b"\xFC\xFF\xFF\xFF": _index.columnAttributesIndex, + b"\xFF\xFF\xFF\xFC": _index.columnAttributesIndex, + b"\xFC\xFF\xFF\xFF\xFF\xFF\xFF\xFF": _index.columnAttributesIndex, + b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC": _index.columnAttributesIndex, + b"\xFE\xFB\xFF\xFF": _index.formatAndLabelIndex, + b"\xFF\xFF\xFB\xFE": _index.formatAndLabelIndex, + b"\xFE\xFB\xFF\xFF\xFF\xFF\xFF\xFF": _index.formatAndLabelIndex, + b"\xFF\xFF\xFF\xFF\xFF\xFF\xFB\xFE": _index.formatAndLabelIndex, + b"\xFE\xFF\xFF\xFF": _index.columnListIndex, + b"\xFF\xFF\xFF\xFE": _index.columnListIndex, + b"\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF": _index.columnListIndex, + b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE": _index.columnListIndex} + + +class _subheader_pointer(object): + pass + + +class _column(object): + pass + + +# SAS7BDAT represents a SAS data file in SAS7BDAT format. +class SAS7BDATReader(BaseIterator): + """ + Read SAS files in SAS7BDAT format. + + Parameters + ---------- + path_or_buf : path name or buffer + Name of SAS file or file-like object pointing to SAS file + contents. + index : column identifier, defaults to None + Column to use as index. + convert_dates : boolean, defaults to True + Attempt to convert dates to Pandas datetime values. Note all + SAS date formats are supported. + blank_missing : boolean, defaults to True + Convert empty strings to missing values (SAS uses blanks to + indicate missing character variables). + chunksize : int, defaults to None + Return SAS7BDATReader object for iterations, returns chunks + with given number of lines. + encoding : string, defaults to None + String encoding. If None, text variables are left as raw bytes. + """ + + def __init__(self, path_or_buf, index=None, convert_dates=True, + blank_missing=True, chunksize=None, encoding=None): + + self.index = index + self.convert_dates = convert_dates + self.blank_missing = blank_missing + self.chunksize = chunksize + self.encoding = encoding + + self.compression = "" + self.column_names_strings = [] + self.column_names = [] + self.column_types = [] + self.column_formats = [] + self.columns = [] + + self._current_page_data_subheader_pointers = [] + self._cached_page = None + self._column_data_lengths = [] + self._column_data_offsets = [] + self._current_row_in_file_index = 0 + self._current_row_on_page_index = 0 + self._current_row_in_file_index = 0 + + self._path_or_buf, _, _ = get_filepath_or_buffer(path_or_buf) + if isinstance(self._path_or_buf, compat.string_types): + self._path_or_buf = open(self._path_or_buf, 'rb') + + self._get_properties() + self._parse_metadata() + + def _get_properties(self): + + # Check magic number + self._path_or_buf.seek(0) + self._cached_page = self._path_or_buf.read(288) + if self._cached_page[0:len(_magic)] != _magic: + raise ValueError("magic number mismatch (not a SAS file?)") + + # Get alignment information + align1, align2 = 0, 0 + buf = self._read_bytes(_align_1_offset, _align_1_length) + if buf == _u64_byte_checker_value: + align2 = _align_2_value + self.U64 = True + self._int_length = 8 + self._page_bit_offset = _page_bit_offset_x64 + self._subheader_pointer_length = _subheader_pointer_length_x64 + else: + self.U64 = False + self._page_bit_offset = _page_bit_offset_x86 + self._subheader_pointer_length = _subheader_pointer_length_x86 + self._int_length = 4 + buf = self._read_bytes(_align_2_offset, _align_2_length) + if buf == _align_1_checker_value: + align1 = _align_2_value + total_align = align1 + align2 + + # Get endianness information + buf = self._read_bytes(_endianness_offset, _endianness_length) + if buf == b'\x01': + self.byte_order = "<" + else: + self.byte_order = ">" + + # Get encoding information + buf = self._read_bytes(_encoding_offset, _encoding_length)[0] + if buf in _encoding_names: + self.file_encoding = _encoding_names[buf] + else: + self.file_encoding = "unknown (code=%s)" % str(buf) + + # Get platform information + buf = self._read_bytes(_platform_offset, _platform_length) + if buf == b'1': + self.platform = "unix" + elif buf == b'2': + self.platform = "windows" + else: + self.platform = "unknown" + + buf = self._read_bytes(_dataset_offset, _dataset_length) + self.name = buf.rstrip(b'\x00 ').decode() + + buf = self._read_bytes(_file_type_offset, _file_type_length) + self.file_type = buf.rstrip(b'\x00 ').decode() + + # Timestamp is epoch 01/01/1960 + epoch = pd.datetime(1960, 1, 1) + x = self._read_float(_date_created_offset + align1, + _date_created_length) + self.date_created = epoch + pd.to_timedelta(x, unit='s') + x = self._read_float(_date_modified_offset + align1, + _date_modified_length) + self.date_modified = epoch + pd.to_timedelta(x, unit='s') + + self.header_length = self._read_int(_header_size_offset + align1, + _header_size_length) + + # Read the rest of the header into cached_page. + buf = self._path_or_buf.read(self.header_length - 288) + self._cached_page += buf + if len(self._cached_page) != self.header_length: + raise ValueError("The SAS7BDAT file appears to be truncated.") + + self._page_length = self._read_int(_page_size_offset + align1, + _page_size_length) + self._page_count = self._read_int(_page_count_offset + align1, + _page_count_length) + + buf = self._read_bytes(_sas_release_offset + total_align, + _sas_release_length) + self.sas_release = buf.rstrip(b'\x00 ').decode() + + buf = self._read_bytes(_sas_server_type_offset + total_align, + _sas_server_type_length) + self.server_type = buf.rstrip(b'\x00 ').decode() + + buf = self._read_bytes(_os_version_number_offset + total_align, + _os_version_number_length) + self.os_version = buf.rstrip(b'\x00 ').decode() + + buf = self._read_bytes( + _os_name_offset, _os_name_length).rstrip(b'\x00 ') + if len(buf) > 0: + self.os_name = buf.rstrip(b'\x00 ').decode() + else: + buf = self._path_or_buf.read(_os_maker_offset, _os_maker_length) + self.os_name = buf.rstrip(b'\x00 ').decode() + + # Read a single float of the given width (4 or 8). + def _read_float(self, offset, width): + if width not in (4, 8): + raise ValueError("invalid float width") + buf = self._read_bytes(offset, width) + fd = "f" if width == 4 else "d" + return struct.unpack(self.byte_order + fd, buf)[0] + + # Read a single signed integer of the given width (1, 2, 4 or 8). + def _read_int(self, offset, width): + if width not in (1, 2, 4, 8): + raise ValueError("invalid int width") + buf = self._read_bytes(offset, width) + it = {1: "b", 2: "h", 4: "l", 8: "q"}[width] + iv = struct.unpack(self.byte_order + it, buf)[0] + return iv + + def _read_bytes(self, offset, length): + if self._cached_page is None: + self._path_or_buf.seek(offset) + buf = self._path_or_buf.read(length) + if len(buf) < length: + msg = "Unable to read {:d} bytes from file position {:d}." + raise ValueError(msg.format(length, offset)) + return buf + else: + if offset + length > len(self._cached_page): + raise ValueError("The cached page is too small.") + return self._cached_page[offset:offset + length] + + def _parse_metadata(self): + done = False + while not done: + self._cached_page = self._path_or_buf.read(self._page_length) + if len(self._cached_page) <= 0: + break + if len(self._cached_page) != self._page_length: + raise ValueError( + "Failed to read a meta data page from the SAS file.") + done = self._process_page_meta() + + def _process_page_meta(self): + self._read_page_header() + pt = [_page_meta_type, _page_amd_type] + _page_mix_types + if self._current_page_type in pt: + self._process_page_metadata() + return ((self._current_page_type in [256] + _page_mix_types) or + (self._current_page_data_subheader_pointers is not None)) + + def _read_page_header(self): + bit_offset = self._page_bit_offset + tx = _page_type_offset + bit_offset + self._current_page_type = self._read_int(tx, _page_type_length) + tx = _block_count_offset + bit_offset + self._current_page_block_count = self._read_int(tx, + _block_count_length) + tx = _subheader_count_offset + bit_offset + self._current_page_subheaders_count = ( + self._read_int(tx, _subheader_count_length)) + + def _process_page_metadata(self): + bit_offset = self._page_bit_offset + + for i in range(self._current_page_subheaders_count): + pointer = self._process_subheader_pointers( + _subheader_pointers_offset + bit_offset, i) + if pointer.length == 0: + continue + if pointer.compression == _truncated_subheader_id: + continue + subheader_signature = self._read_subheader_signature( + pointer.offset) + subheader_index = ( + self._get_subheader_index(subheader_signature, + pointer.compression, pointer.ptype)) + self._process_subheader(subheader_index, pointer) + + def _get_subheader_index(self, signature, compression, ptype): + index = _subheader_signature_to_index.get(signature) + if index is None: + f1 = ((compression == _compressed_subheader_id) or + (compression == 0)) + f2 = (ptype == _compressed_subheader_type) + if (self.compression != "") and f1 and f2: + index = _index.dataSubheaderIndex + else: + raise ValueError("Unknown subheader signature") + return index + + def _process_subheader_pointers(self, offset, subheader_pointer_index): + + subheader_pointer_length = self._subheader_pointer_length + total_offset = (offset + + subheader_pointer_length * subheader_pointer_index) + + subheader_offset = self._read_int(total_offset, self._int_length) + total_offset += self._int_length + + subheader_length = self._read_int(total_offset, self._int_length) + total_offset += self._int_length + + subheader_compression = self._read_int(total_offset, 1) + total_offset += 1 + + subheader_type = self._read_int(total_offset, 1) + + x = _subheader_pointer() + x.offset = subheader_offset + x.length = subheader_length + x.compression = subheader_compression + x.ptype = subheader_type + + return x + + def _read_subheader_signature(self, offset): + subheader_signature = self._read_bytes(offset, self._int_length) + return subheader_signature + + def _process_subheader(self, subheader_index, pointer): + offset = pointer.offset + length = pointer.length + + if subheader_index == _index.rowSizeIndex: + processor = self._process_rowsize_subheader + elif subheader_index == _index.columnSizeIndex: + processor = self._process_columnsize_subheader + elif subheader_index == _index.columnTextIndex: + processor = self._process_columntext_subheader + elif subheader_index == _index.columnNameIndex: + processor = self._process_columnname_subheader + elif subheader_index == _index.columnAttributesIndex: + processor = self._process_columnattributes_subheader + elif subheader_index == _index.formatAndLabelIndex: + processor = self._process_format_subheader + elif subheader_index == _index.columnListIndex: + processor = self._process_columnlist_subheader + elif subheader_index == _index.subheaderCountsIndex: + processor = self._process_subheader_counts + elif subheader_index == _index.dataSubheaderIndex: + self._current_page_data_subheader_pointers.append(pointer) + return + else: + raise ValueError("unknown subheader index") + + processor(offset, length) + + def _process_rowsize_subheader(self, offset, length): + + int_len = self._int_length + lcs_offset = offset + lcp_offset = offset + if self.U64: + lcs_offset += 682 + lcp_offset += 706 + else: + lcs_offset += 354 + lcp_offset += 378 + + self.row_length = self._read_int( + offset + _row_length_offset_multiplier * int_len, int_len) + self.row_count = self._read_int( + offset + _row_count_offset_multiplier * int_len, int_len) + self.col_count_p1 = self._read_int( + offset + _col_count_p1_multiplier * int_len, int_len) + self.col_count_p2 = self._read_int( + offset + _col_count_p2_multiplier * int_len, int_len) + mx = _row_count_on_mix_page_offset_multiplier * int_len + self._mix_page_row_count = self._read_int(offset + mx, int_len) + self._lcs = self._read_int(lcs_offset, 2) + self._lcp = self._read_int(lcp_offset, 2) + + def _process_columnsize_subheader(self, offset, length): + int_len = self._int_length + offset += int_len + self.column_count = self._read_int(offset, int_len) + if (self.col_count_p1 + self.col_count_p2 != + self.column_count): + print("Warning: column count mismatch (%d + %d != %d)\n", + self.col_count_p1, self.col_count_p2, self.column_count) + + # Unknown purpose + def _process_subheader_counts(self, offset, length): + pass + + def _process_columntext_subheader(self, offset, length): + + offset += self._int_length + text_block_size = self._read_int(offset, _text_block_size_length) + + buf = self._read_bytes(offset, text_block_size) + self.column_names_strings.append( + buf[0:text_block_size].rstrip(b"\x00 ").decode()) + + if len(self.column_names_strings) == 1: + column_name = self.column_names_strings[0] + compression_literal = "" + for cl in _compression_literals: + if cl in column_name: + compression_literal = cl + self.compression = compression_literal + offset -= self._int_length + + offset1 = offset + 16 + if self.U64: + offset1 += 4 + + buf = self._read_bytes(offset1, self._lcp) + compression_literal = buf.rstrip(b"\x00") + if compression_literal == "": + self._lcs = 0 + offset1 = offset + 32 + if self.U64: + offset1 += 4 + buf = self._read_bytes(offset1, self._lcp) + self.creator_proc = buf[0:self._lcp].decode() + elif compression_literal == _rle_compression: + offset1 = offset + 40 + if self.U64: + offset1 += 4 + buf = self._read_bytes(offset1, self._lcp) + self.creator_proc = buf[0:self._lcp].decode() + elif self._lcs > 0: + self._lcp = 0 + offset1 = offset + 16 + if self.U64: + offset1 += 4 + buf = self._read_bytes(offset1, self._lcs) + self.creator_proc = buf[0:self._lcp].decode() + + def _process_columnname_subheader(self, offset, length): + int_len = self._int_length + offset += int_len + column_name_pointers_count = (length - 2 * int_len - 12) // 8 + for i in range(column_name_pointers_count): + text_subheader = offset + _column_name_pointer_length * \ + (i + 1) + _column_name_text_subheader_offset + col_name_offset = offset + _column_name_pointer_length * \ + (i + 1) + _column_name_offset_offset + col_name_length = offset + _column_name_pointer_length * \ + (i + 1) + _column_name_length_offset + + idx = self._read_int( + text_subheader, _column_name_text_subheader_length) + col_offset = self._read_int( + col_name_offset, _column_name_offset_length) + col_len = self._read_int( + col_name_length, _column_name_length_length) + + name_str = self.column_names_strings[idx] + self.column_names.append(name_str[col_offset:col_offset + col_len]) + + def _process_columnattributes_subheader(self, offset, length): + int_len = self._int_length + column_attributes_vectors_count = ( + length - 2 * int_len - 12) // (int_len + 8) + self.column_types = np.empty( + column_attributes_vectors_count, dtype=np.dtype('S1')) + for i in range(column_attributes_vectors_count): + col_data_offset = (offset + int_len + + _column_data_offset_offset + i * (int_len + 8)) + col_data_len = (offset + 2 * int_len + + _column_data_length_offset + i * (int_len + 8)) + col_types = (offset + 2 * int_len + + _column_type_offset + i * (int_len + 8)) + + self._column_data_offsets.append( + self._read_int(col_data_offset, int_len)) + + x = self._read_int(col_data_len, _column_data_length_length) + self._column_data_lengths.append(x) + + x = self._read_int(col_types, _column_type_length) + if x == 1: + self.column_types[i] = b'd' + else: + self.column_types[i] = b's' + + def _process_columnlist_subheader(self, offset, length): + # unknown purpose + pass + + def _process_format_subheader(self, offset, length): + int_len = self._int_length + text_subheader_format = offset + \ + _column_format_text_subheader_index_offset + 3 * int_len + col_format_offset = offset + _column_format_offset_offset + 3 * int_len + col_format_len = offset + _column_format_length_offset + 3 * int_len + text_subheader_label = offset + \ + _column_label_text_subheader_index_offset + 3 * int_len + col_label_offset = offset + _column_label_offset_offset + 3 * int_len + col_label_len = offset + _column_label_length_offset + 3 * int_len + + x = self._read_int(text_subheader_format, + _column_format_text_subheader_index_length) + format_idx = min(x, len(self.column_names_strings) - 1) + + format_start = self._read_int( + col_format_offset, _column_format_offset_length) + format_len = self._read_int( + col_format_len, _column_format_length_length) + + label_idx = self._read_int( + text_subheader_label, _column_label_text_subheader_index_length) + label_idx = min(label_idx, len(self.column_names_strings) - 1) + + label_start = self._read_int( + col_label_offset, _column_label_offset_length) + label_len = self._read_int(col_label_len, _column_label_length_length) + + label_names = self.column_names_strings[label_idx] + column_label = label_names[label_start: label_start + label_len] + format_names = self.column_names_strings[format_idx] + column_format = format_names[format_start: format_start + format_len] + current_column_number = len(self.columns) + + col = _column() + col.col_id = current_column_number + col.name = self.column_names[current_column_number] + col.label = column_label + col.format = column_format + col.ctype = self.column_types[current_column_number] + col.length = self._column_data_lengths[current_column_number] + + self.column_formats.append(column_format) + self.columns.append(col) + + def read(self, nrows=None): + + if (nrows is None) and (self.chunksize is not None): + nrows = self.chunksize + elif nrows is None: + nrows = self.row_count + + if self._current_row_in_file_index >= self.row_count: + return None + + nd = (self.column_types == b'd').sum() + ns = (self.column_types == b's').sum() + + self._string_chunk = np.empty((ns, nrows), dtype=np.object) + self._byte_chunk = np.empty((nd, 8 * nrows), dtype=np.uint8) + + self._current_row_in_chunk_index = 0 + for i in range(nrows): + done = self._readline() + if done: + break + + rslt = self._chunk_to_dataframe() + if self.index is not None: + rslt = rslt.set_index(self.index) + + return rslt + + def _readline(self): + + bit_offset = self._page_bit_offset + subheader_pointer_length = self._subheader_pointer_length + + # If there is no page, go to the end of the header and read a page. + if self._cached_page is None: + self._path_or_buf.seek(self.header_length) + done = self._read_next_page() + if done: + return True + + # Loop until a data row is read + while True: + if self._current_page_type == _page_meta_type: + flag = (self._current_row_on_page_index >= + len(self._current_page_data_subheader_pointers)) + if flag: + done = self._read_next_page() + if done: + return True + self._current_row_on_page_index = 0 + continue + current_subheader_pointer = ( + self._current_page_data_subheader_pointers[ + self._current_row_on_page_index]) + process_byte_array_with_data(self, + current_subheader_pointer.offset, + current_subheader_pointer.length, + self._byte_chunk, + self._string_chunk) + return False + elif self._current_page_type in _page_mix_types: + align_correction = (bit_offset + _subheader_pointers_offset + + self._current_page_subheaders_count * + subheader_pointer_length) + align_correction = align_correction % 8 + offset = bit_offset + align_correction + offset += _subheader_pointers_offset + offset += (self._current_page_subheaders_count * + subheader_pointer_length) + offset += self._current_row_on_page_index * self.row_length + process_byte_array_with_data(self, offset, self.row_length, + self._byte_chunk, + self._string_chunk) + mn = min(self.row_count, self._mix_page_row_count) + if self._current_row_on_page_index == mn: + done = self._read_next_page() + if done: + return True + self._current_row_on_page_index = 0 + return False + elif self._current_page_type == _page_data_type: + process_byte_array_with_data(self, + bit_offset + + _subheader_pointers_offset + + self._current_row_on_page_index * + self.row_length, + self.row_length, self._byte_chunk, + self._string_chunk) + flag = (self._current_row_on_page_index == + self._current_page_block_count) + if flag: + done = self._read_next_page() + if done: + return True + self._current_row_on_page_index = 0 + return False + else: + raise ValueError("unknown page type: %s", + self._current_page_type) + + def _read_next_page(self): + self._current_page_data_subheader_pointers = [] + self._cached_page = self._path_or_buf.read(self._page_length) + if len(self._cached_page) <= 0: + return True + elif len(self._cached_page) != self._page_length: + msg = ("failed to read complete page from file " + "(read {:d} of {:d} bytes)") + raise ValueError(msg.format(len(self._cached_page), + self._page_length)) + + self._read_page_header() + if self._current_page_type == _page_meta_type: + self._process_page_metadata() + pt = [_page_meta_type, _page_data_type] + [_page_mix_types] + if self._current_page_type not in pt: + return self._read_next_page() + + return False + + def _decompress(self, row_length, page): + page = np.frombuffer(page, dtype=np.uint8) + if self.compression == _rle_compression: + return _rle_decompress(row_length, page) + elif self.compression == _rdc_compression: + return _rdc_decompress(row_length, page) + else: + raise ValueError("unknown SAS compression method: %s" % + self.compression) + + def _chunk_to_dataframe(self): + + n = self._current_row_in_chunk_index + m = self._current_row_in_file_index + ix = range(m - n, m) + rslt = pd.DataFrame(index=ix) + + js, jb = 0, 0 + for j in range(self.column_count): + + name = self.column_names[j] + + if self.column_types[j] == b'd': + rslt[name] = self._byte_chunk[jb, :].view( + dtype=self.byte_order + 'd') + rslt[name] = np.asarray(rslt[name], dtype=np.float64) + if self.convert_dates and (self.column_formats[j] == "MMDDYY"): + epoch = pd.datetime(1960, 1, 1) + rslt[name] = epoch + pd.to_timedelta(rslt[name], unit='d') + jb += 1 + elif self.column_types[j] == b's': + rslt[name] = self._string_chunk[js, :] + rslt[name] = rslt[name].apply(lambda x: x.rstrip(b'\x00 ')) + if self.encoding is not None: + rslt[name] = rslt[name].apply( + lambda x: x.decode(encoding=self.encoding)) + if self.blank_missing: + ii = rslt[name].str.len() == 0 + rslt.loc[ii, name] = np.nan + js += 1 + else: + raise ValueError("unknown column type %s" % + self.column_types[j]) + + return rslt diff --git a/pandas/io/sas.py b/pandas/io/sas/sas_xport.py similarity index 86% rename from pandas/io/sas.py rename to pandas/io/sas/sas_xport.py index 49013a98c77ff..e4ca99fdcb109 100644 --- a/pandas/io/sas.py +++ b/pandas/io/sas/sas_xport.py @@ -15,9 +15,10 @@ import struct import numpy as np from pandas.util.decorators import Appender +import warnings -_correct_line1 = ("HEADER RECORD*******LIBRARY HEADER RECORD" - "!!!!!!!000000000000000000000000000000 ") +_correct_line1 = ("HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!" + "000000000000000000000000000000 ") _correct_header1 = ("HEADER RECORD*******MEMBER HEADER RECORD!!!!!!!" "000000000000000001600000000") _correct_header2 = ("HEADER RECORD*******DSCRPTR HEADER RECORD!!!!!!!" @@ -28,6 +29,7 @@ 'nform', 'nfl', 'num_decimals', 'nfj', 'nfill', 'niform', 'nifl', 'nifd', 'npos', '_'] + _base_params_doc = """\ Parameters ---------- @@ -112,25 +114,6 @@ """ -@Appender(_read_sas_doc) -def read_sas(filepath_or_buffer, format='xport', index=None, - encoding='ISO-8859-1', chunksize=None, iterator=False): - - format = format.lower() - - if format == 'xport': - reader = XportReader(filepath_or_buffer, index=index, - encoding=encoding, - chunksize=chunksize) - else: - raise ValueError('only xport format is supported') - - if iterator or chunksize: - return reader - - return reader.read() - - def _parse_date(datestr): """ Given a date in xport format, return Python date. """ try: @@ -282,8 +265,9 @@ def _read_header(self): raise ValueError("Header record is not an XPORT file.") line2 = self._get_row() - file_info = _split_line(line2, [['prefix', 24], ['version', 8], - ['OS', 8], ['_', 24], ['created', 16]]) + fif = [['prefix', 24], ['version', 8], ['OS', 8], + ['_', 24], ['created', 16]] + file_info = _split_line(line2, fif) if file_info['prefix'] != "SAS SAS SASLIB": raise ValueError("Header record has invalid prefix.") file_info['created'] = _parse_date(file_info['created']) @@ -295,22 +279,19 @@ def _read_header(self): # read member header header1 = self._get_row() header2 = self._get_row() - if (not header1.startswith(_correct_header1) or - not header2 == _correct_header2): - raise ValueError("Member header not found.") - fieldnamelength = int(header1[-5:-2]) # usually 140, could be 135 + headflag1 = header1.startswith(_correct_header1) + headflag2 = (header2 == _correct_header2) + if not (headflag1 and headflag2): + raise ValueError("Member header not found") + # usually 140, could be 135 + fieldnamelength = int(header1[-5:-2]) # member info - member_info = _split_line(self._get_row(), [['prefix', 8], - ['set_name', 8], - ['sasdata', 8], - ['version', 8], - ['OS', 8], ['_', 24], - ['created', 16]]) - member_info.update(_split_line(self._get_row(), - [['modified', 16], - ['_', 16], - ['label', 40], ['type', 8]])) + mem = [['prefix', 8], ['set_name', 8], ['sasdata', 8], + ['version', 8], ['OS', 8], ['_', 24], ['created', 16]] + member_info = _split_line(self._get_row(), mem) + mem = [['modified', 16], ['_', 16], ['label', 40], ['type', 8]] + member_info.update(_split_line(self._get_row(), mem)) member_info['modified'] = _parse_date(member_info['modified']) member_info['created'] = _parse_date(member_info['created']) self.member_info = member_info @@ -319,15 +300,16 @@ def _read_header(self): types = {1: 'numeric', 2: 'char'} fieldcount = int(self._get_row()[54:58]) datalength = fieldnamelength * fieldcount - if datalength % 80: # round up to nearest 80 + # round up to nearest 80 + if datalength % 80: datalength += 80 - datalength % 80 fielddata = self.filepath_or_buffer.read(datalength) fields = [] obs_length = 0 while len(fielddata) >= fieldnamelength: # pull data for one field - field, fielddata = ( - fielddata[:fieldnamelength], fielddata[fieldnamelength:]) + field, fielddata = (fielddata[:fieldnamelength], + fielddata[fieldnamelength:]) # rest at end gets ignored, so if field is short, pad out # to match struct pattern below @@ -339,8 +321,8 @@ def _read_header(self): field['ntype'] = types[field['ntype']] fl = field['field_length'] if field['ntype'] == 'numeric' and ((fl < 2) or (fl > 8)): - raise TypeError("Floating point field width %d is not between " - "2 and 8." % fl) + msg = "Floating field width {0} is not between 2 and 8." + raise TypeError(msg.format(fl)) for k, v in field.items(): try: @@ -376,8 +358,8 @@ def _record_count(self): """ Get number of records in file. - This is maybe suboptimal because we have to seek to the end of the - file. + This is maybe suboptimal because we have to seek to the end of + the file. Side effect: returns file position to record_start. """ @@ -387,7 +369,6 @@ def _record_count(self): self.record_start) if total_records_length % 80 != 0: - import warnings warnings.warn("xport file may be corrupted") if self.record_length > 80: @@ -461,7 +442,8 @@ def read(self, nrows=None): elif self.fields[j]['ntype'] == 'char': v = [y.rstrip() for y in vec] if compat.PY3: - v = [y.decode(self._encoding) for y in v] + if self._encoding is not None: + v = [y.decode(self._encoding) for y in v] df[x] = v if self._index is None: diff --git a/pandas/io/sas/saslib.pyx b/pandas/io/sas/saslib.pyx new file mode 100644 index 0000000000000..a963bf4fe25d3 --- /dev/null +++ b/pandas/io/sas/saslib.pyx @@ -0,0 +1,237 @@ +import numpy as np +cimport numpy as np +from numpy cimport uint8_t, uint16_t + +# rle_decompress decompresses data using a Run Length Encoding +# algorithm. It is partially documented here: +# +# https://cran.r-project.org/web/packages/sas7bdat/vignettes/sas7bdat.pdf +def _rle_decompress(int result_length, np.ndarray[uint8_t, ndim=1] inbuff): + + cdef uint8_t control_byte + cdef uint8_t [:] result = np.zeros(result_length, np.uint8) + + cdef int rpos = 0 + cdef int ipos = 0 + cdef int i + cdef int nbytes + cdef uint8_t x + cdef length = len(inbuff) + + while ipos < length: + control_byte = inbuff[ipos] & 0xF0 + end_of_first_byte = int(inbuff[ipos] & 0x0F) + ipos += 1 + + if control_byte == 0x00: + if end_of_first_byte != 0: + print("Unexpected non-zero end_of_first_byte") + nbytes = int(inbuff[ipos]) + 64 + ipos += 1 + for i in range(nbytes): + result[rpos] = inbuff[ipos] + rpos += 1 + ipos += 1 + elif control_byte == 0x40: + # not documented + nbytes = end_of_first_byte * 16 + nbytes += int(inbuff[ipos]) + ipos += 1 + for i in range(nbytes): + result[rpos] = inbuff[ipos] + rpos += 1 + ipos += 1 + elif control_byte == 0x60: + nbytes = end_of_first_byte*256 + int(inbuff[ipos]) + 17 + ipos += 1 + for i in range(nbytes): + result[rpos] = 0x20 + rpos += 1 + elif control_byte == 0x70: + nbytes = end_of_first_byte*256 + int(inbuff[ipos]) + 17 + ipos += 1 + for i in range(nbytes): + result[rpos] = 0x00 + rpos += 1 + elif control_byte == 0x80: + nbytes = end_of_first_byte + 1 + for i in range(nbytes): + result[rpos] = inbuff[ipos + i] + rpos += 1 + ipos += nbytes + elif control_byte == 0x90: + nbytes = end_of_first_byte + 17 + for i in range(nbytes): + result[rpos] = inbuff[ipos + i] + rpos += 1 + ipos += nbytes + elif control_byte == 0xA0: + nbytes = end_of_first_byte + 33 + for i in range(nbytes): + result[rpos] = inbuff[ipos + i] + rpos += 1 + ipos += nbytes + elif control_byte == 0xB0: + nbytes = end_of_first_byte + 49 + for i in range(nbytes): + result[rpos] = inbuff[ipos + i] + rpos += 1 + ipos += nbytes + elif control_byte == 0xC0: + nbytes = end_of_first_byte + 3 + x = inbuff[ipos] + ipos += 1 + for i in range(nbytes): + result[rpos] = x + rpos += 1 + elif control_byte == 0xD0: + nbytes = end_of_first_byte + 2 + for i in range(nbytes): + result[rpos] = 0x40 + rpos += 1 + elif control_byte == 0xE0: + nbytes = end_of_first_byte + 2 + for i in range(nbytes): + result[rpos] = 0x20 + rpos += 1 + elif control_byte == 0xF0: + nbytes = end_of_first_byte + 2 + for i in range(nbytes): + result[rpos] = 0x00 + rpos += 1 + else: + raise ValueError("unknown control byte: %v", control_byte) + + if len(result) != result_length: + print("RLE: %v != %v\n", (len(result), result_length)) + + return np.asarray(result).tostring() + + +# rdc_decompress decompresses data using the Ross Data Compression algorithm: +# +# http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/1992/9210/ross/ross.htm +def _rdc_decompress(int result_length, np.ndarray[uint8_t, ndim=1] inbuff): + + cdef uint8_t cmd + cdef uint16_t ctrl_bits + cdef uint16_t ctrl_mask = 0 + cdef uint16_t ofs + cdef uint16_t cnt + cdef int ipos = 0 + cdef int rpos = 0 + cdef int k + + cdef uint8_t [:] outbuff = np.zeros(result_length, dtype=np.uint8) + + ii = -1 + + while ipos < len(inbuff): + ii += 1 + ctrl_mask = ctrl_mask >> 1 + if ctrl_mask == 0: + ctrl_bits = (inbuff[ipos] << 8) + inbuff[ipos + 1] + ipos += 2 + ctrl_mask = 0x8000 + + if ctrl_bits & ctrl_mask == 0: + outbuff[rpos] = inbuff[ipos] + ipos += 1 + rpos += 1 + continue + + cmd = (inbuff[ipos] >> 4) & 0x0F + cnt = (inbuff[ipos] & 0x0F) + ipos += 1 + + # short RLE + if cmd == 0: + cnt += 3 + for k in range(cnt): + outbuff[rpos + k] = inbuff[ipos] + rpos += cnt + ipos += 1 + + # long RLE + elif cmd == 1: + cnt += inbuff[ipos] << 4 + cnt += 19 + ipos += 1 + for k in range(cnt): + outbuff[rpos + k] = inbuff[ipos] + rpos += cnt + ipos += 1 + + # long pattern + elif cmd == 2: + ofs = cnt + 3 + ofs += inbuff[ipos] << 4 + ipos += 1 + cnt = inbuff[ipos] + ipos += 1 + cnt += 16 + for k in range(cnt): + outbuff[rpos + k] = outbuff[rpos - int(ofs) + k] + rpos += cnt + + # short pattern + elif (cmd >= 3) & (cmd <= 15): + ofs = cnt + 3 + ofs += inbuff[ipos] << 4 + ipos += 1 + for k in range(cmd): + outbuff[rpos + k] = outbuff[rpos - int(ofs) + k] + rpos += cmd + + else: + raise ValueError("unknown RDC command") + + if len(outbuff) != result_length: + raise ValueError("RDC: %v != %v\n", len(outbuff), result_length) + + return np.asarray(outbuff).tostring() + +def process_byte_array_with_data(parser, int offset, int length, np.ndarray[uint8_t, ndim=2] byte_chunk, + np.ndarray[dtype=object, ndim=2] string_chunk): + + cdef int s + cdef int j + cdef int m + cdef int start + cdef int end + cdef bytes source + cdef bytes temp + cdef int jb + cdef int js + + if (parser.compression != "") and (length < parser.row_length): + source = parser._decompress(parser.row_length, parser._cached_page[offset:offset + length]) + else: + source = parser._cached_page[offset:offset + length] + + s = 8 * parser._current_row_in_chunk_index + js = 0 + jb = 0 + for j in range(parser.column_count): + length = parser._column_data_lengths[j] + if length == 0: + break + start = parser._column_data_offsets[j] + end = start + length + temp = source[start:end] + if parser.column_types[j] == b'd': + m = 8 - length + if parser.byte_order == "<": + byte_chunk[jb, s+m:s+8] = np.frombuffer(temp, dtype=np.uint8) + else: + byte_chunk[jb, s:s+length] = np.frombuffer(temp, dtype=np.uint8) + jb += 1 + elif parser.column_types[j] == b's': + string_chunk[js, parser._current_row_in_chunk_index] = bytes(temp) + js += 1 + else: + raise ValueError("unknown column type: %s" % parser.columns[j].ctype) + + parser._current_row_on_page_index += 1 + parser._current_row_in_chunk_index += 1 + parser._current_row_in_file_index += 1 diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py new file mode 100644 index 0000000000000..9a60200c78893 --- /dev/null +++ b/pandas/io/sas/sasreader.py @@ -0,0 +1,61 @@ +""" +Read SAS sas7bdat or xport files. +""" + + +def read_sas(filepath_or_buffer, format=None, index=None, encoding=None, + chunksize=None, iterator=False): + """ + Read SAS files stored as either XPORT or SAS7BDAT format files. + + Parameters + ---------- + filepath_or_buffer : string or file-like object + Path to the SAS file. + format : string {'xport', 'sas7bdat'} or None + If None, file format is inferred. If 'xport' or 'sas7bdat', + uses the corresponding format. + index : identifier of index column, defaults to None + Identifier of column that should be used as index of the DataFrame. + encoding : string, default is None + Encoding for text data. If None, text data are stored as raw bytes. + chunksize : int + Read file `chunksize` lines at a time, returns iterator. + iterator : bool, defaults to False + If True, returns an iterator for reading the file incrementally. + + Returns + ------- + DataFrame if iterator=False and chunksize=None, else SAS7BDATReader + or XportReader + """ + + if format is None: + try: + fname = filepath_or_buffer.lower() + if fname.endswith(".xpt"): + format = "xport" + elif fname.endswith(".sas7bdat"): + format = "sas7bdat" + else: + raise ValueError("unable to infer format of SAS file") + except: + pass + + if format.lower() == 'xport': + from pandas.io.sas.sas_xport import XportReader + reader = XportReader(filepath_or_buffer, index=index, + encoding=encoding, + chunksize=chunksize) + elif format.lower() == 'sas7bdat': + from pandas.io.sas.sas7bdat import SAS7BDATReader + reader = SAS7BDATReader(filepath_or_buffer, index=index, + encoding=encoding, + chunksize=chunksize) + else: + raise ValueError('unknown SAS format') + + if iterator or chunksize: + return reader + + return reader.read() diff --git a/pandas/io/tests/data/DEMO_G.csv b/pandas/io/tests/sas/data/DEMO_G.csv similarity index 100% rename from pandas/io/tests/data/DEMO_G.csv rename to pandas/io/tests/sas/data/DEMO_G.csv diff --git a/pandas/io/tests/data/DEMO_G.xpt b/pandas/io/tests/sas/data/DEMO_G.xpt similarity index 100% rename from pandas/io/tests/data/DEMO_G.xpt rename to pandas/io/tests/sas/data/DEMO_G.xpt diff --git a/pandas/io/tests/data/DRXFCD_G.csv b/pandas/io/tests/sas/data/DRXFCD_G.csv similarity index 100% rename from pandas/io/tests/data/DRXFCD_G.csv rename to pandas/io/tests/sas/data/DRXFCD_G.csv diff --git a/pandas/io/tests/data/DRXFCD_G.xpt b/pandas/io/tests/sas/data/DRXFCD_G.xpt similarity index 100% rename from pandas/io/tests/data/DRXFCD_G.xpt rename to pandas/io/tests/sas/data/DRXFCD_G.xpt diff --git a/pandas/io/tests/data/SSHSV1_A.csv b/pandas/io/tests/sas/data/SSHSV1_A.csv similarity index 100% rename from pandas/io/tests/data/SSHSV1_A.csv rename to pandas/io/tests/sas/data/SSHSV1_A.csv diff --git a/pandas/io/tests/data/SSHSV1_A.xpt b/pandas/io/tests/sas/data/SSHSV1_A.xpt similarity index 100% rename from pandas/io/tests/data/SSHSV1_A.xpt rename to pandas/io/tests/sas/data/SSHSV1_A.xpt diff --git a/pandas/io/tests/data/paxraw_d_short.csv b/pandas/io/tests/sas/data/paxraw_d_short.csv similarity index 100% rename from pandas/io/tests/data/paxraw_d_short.csv rename to pandas/io/tests/sas/data/paxraw_d_short.csv diff --git a/pandas/io/tests/data/paxraw_d_short.xpt b/pandas/io/tests/sas/data/paxraw_d_short.xpt similarity index 100% rename from pandas/io/tests/data/paxraw_d_short.xpt rename to pandas/io/tests/sas/data/paxraw_d_short.xpt diff --git a/pandas/io/tests/sas/data/test1.sas7bdat b/pandas/io/tests/sas/data/test1.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..951173ce4d9f9395cf5f7c1e2c51ac4bd51ea51c GIT binary patch literal 131072 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 Pcs5Ya|EzF!lEeQ3c5b?k literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test11.sas7bdat b/pandas/io/tests/sas/data/test11.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..072aa683f66d992a2e96fe872af583a915e8dfc9 GIT binary patch literal 196608 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%0AZ^={?p%~Le*nSmO(_>cG?VGxaQ z^r(~E?T52mIKbA^pz0VcR*}rc@R2q8$~QrCOzznzUaXC&)>^&>%^}!(v9(DKmK@|; zz;C?%>O?p=XLt7=nKWnMVz>XH1b#hqx#R-86DQ=yH+N@O@e;A`O)wSo@OcXZu7D4! zfYE_n-dW?`co5EpgdZjIvDMo1%^-^avrRbAxnZvHJy+%OJm|J=tqP0QufL*+BRBV6iwV*k^^6g+Udn9>k;L3$=c&-&8?DzlVLwej@ zqpy8M)EKT$spEqyyUlicPqpce2`rp!^eD@NMJe0rkift2ae6z0Oj*r&GQN5fcc)I*0x_H~Er)&D35{3Id>jsZKD-O=- z&76x3YIz6(V^1S`s$E>UO9spL!OTw2zLwt#bC?fEVgE(Y6=7-2WH^8x1J$frzt8zQ zd4Rs03eWqbnfEIG7>MZgu&hABz#4b!e(`E{9V_X^i(&tCuK)?Y%|{2HNQPMidq9O# zzDpnAMb*wG5p-G6wwte9zWujv@d6lr{cuq2NY%jBGA^I12V9*8MFwy?FRpfa+*=@F z@NWO@uExUBBo4;}Z{^+Z2GwC1?0fJrHSU&^a4>ni2fy461~8`D+2DfropA6b-~P>s z$&0n6v*5XHm^j^Ufet)9R|e6!qHG$j46BXD4_+bxh!Q!kf*N zX-R(AOovCE$$0wyplecP3KLQIm*9}|!C6P^&#@)?5+)*VSI2yiO4xk&&!pQfVb3}t z-s-TCEizCR@nK?f17OP5!1#U_%mY z9UJr0e2kd;RA_h@xu>(yK^StuWT*Fi5$?ua>zDsI_q) z)Y>jg>6#`H%pqZGd=ONfUu+t*^6eI$3UxdQ!ET^3tYUDbE8sqt%)tN(x=DAN2`A)1 zaj5sq8hM0QTn1~K0KQb?ntNGmJG5lQMN zih6a=O0DO*I$or|>@t!P6hULI9P_@c*JU^{Sp70HA zpxW>2HclQLuk$34ZM7(0;*%1f>lXi&pgIRxG^FF)H~Ese-MqstyT<)+(-@iVwEVrK zhxZ5=Z9yU*`0Sm+#a?_Ej%ml@ZozAWIo?%s*$#hNb+6NqA;B(7CwqAV^r?9|RIFa? z*dp@2!;sK9ANcl*O)@LoFiM>0qibBht8u;eB-58Z%ZF4a*4Ma>3EN5dA@?m9U9GME z88qx1-t*j_0x4yaHSf;-C5d42G7iF7>^&l}!IfZONo6k{d|eko)^Ol+j5*8{3O9B+ zq&Ol^uG7Xjm+Qi3;miiFepbJSslXf1I^e`U2U_r9Bk&FI!!`szEMe?A?>6+7(SpUM zV(Hg!W1b^CXrnk{i~VP-wJ}`BjOrr@-)VaW*B+k>r`E~w&H#hE6mJkmW3WxT6yny{ zulP_n==f9R;O-FVG>@~^1Ft_8P{DOdz;!kc<+p)qZ;e~zBh$bU+eP^3?tzpYf-xTl z9{+lFH`q&FT&qK1c&ZMnAC{-_eSEfaJ9l@0;yp;*9_%a@(VTC*s*}M+Bu;X}h3O`E z*`e?QWH=yr%PVlg9>Ij|b~aWlxp^>DlR137n-{f-)Tcq@Bp=kctFPcYA1QHon{Q;F z&%Y~mWEty!<^Aw#uQJLX1m)JR0n=Ta=oG1SmAHc?J_fh2!PU;4)z{V)^@0#Rdcvgv z{e8AmrV&^1G>B80ktZh<;7;D7wpwf2;jj=XOCMX?EQ$fW!?^Yq1zWu@@^FgR^ zgty)Rs&|F!cjJR=TpNA}h%&tG=%2$O3?+I$db;ebw2^Kw>&+7`hdU4CbkJGgD`+_& z`BZi)_=UW_Z`}c!&Y~;!x*z?Ux}LB9HE7;g`F1~jDrA~NYuuY4M9N?Qv4)Rzu(Tw; zaYAp4KZ}hozZ_EOdqfh3`wbaaABTR9bzS_qLzB7n{DkG~SzYAOy%;3Y^Yu~(?01^? zm`IKxs}OgZ6&GMER%Apu$nDe~9qrA*vNIgQP0x$Z8*4=*cKiSOq707DABJWp^U?E%%XEN$$U@ABSrg`2e=EpY@A#0P;E5rYqI8l+zj z`ROAvx!v&^sM@m<2VHvSqpS?-$jv>g0z4lfLwCJ6?oW$L^7vel7eVNL^(UYT$~ZgrqeS9NuHXz6bre=X~x1%jGSwr;9Hw z34*wD9Bl7A?-`N0-FIieT`xihq+R+Dk$6GorZ1fin$L?8hy5kszJAE|E_gawnY1|J z&tl^~A9nS`-z;{f^=bJhJe?ghJS7SYxzke|fm*ez{F;3)qGGv>+akcTtHmNb%xM0rWKl7K6B-hg;uJtf6g6m?8aU#~^ zIxpLtiK|VAY;!0^n~42!?GY<+y%W!RTtPWbbBu8!*V7=|)W_9kg>17dMw`g>%#-W+ zV_fU;%W-DK7$`^CUQN}e_V0-kBiH3`o$P0ay`<2Tygo2%Ol50 zjWJH-dZhoj;_@GGK=2>*Suw_mT#xi0XI%c{ESKYy#TX}Yf2997 ze{{bbXI6}HBG)7RM~};Y^l~{)S&VTa*CYK$kIR2_F30H?W1PtK zNdM8}@*mwJ$4QMbPUL!||LAe~4_v9if3%A+#)(*uCjCc?%YU>EInJRN<3y}Slm4T{ z} zjBz5@BmGB<%YQU3$LSYioXGV^|Iy;|AI&4jNsTd1#Cfer|Iy;|AGn}{|FDZO#z}rJ(KZWN^+i<`(}cJxj94y+g8oFUUrHPe{-DSmcb5tUmywU;l-yhPmT8lg{B1xx*okRDD8bB*kLNY-Bg z+2HwANDt?dSzmL9WPKyZI3GCgLUnpuWKT%en?W|}_X+8>42xV4lJz$%^?69I6F$`QNJpr*JfB`e@NClKsM^vhV?o)F_h zb69JU8$z;v7G$IUrjQ=;kWkxQAzA+tWTXC`kX}1rkvl>%+;2klPloi6gN6G4DkMAP zDWm*L`8=Kj?ob^)DI`0RLB{#$y+eA)Kh6I2J|Wq070Ad(&j{)D0*lN;vcm(i(SLDB zua6S4+j8`E!OtN^Qop{en-uzCIULI}EUU2eV>u7Y6<9W48I-3U1Ah|)80*0Df+{s9 zmMK`KW0`|x5tcqIE3ll7<)c_G!g3Xsjaar}*^cEgEH9{1cVd}>WjdBQSQcUF!?FU) z=~zCBem2DjiNNQ?N|OG6%~dEPYs3U^yMjN3mRlj*VZAZGJg6emS=J z<=FV;*yfjO_!Zjb zS7_r`Xq#VVhDi8~GXzBW>*~4)rHn!j%(?JQ?4pOt@8G+K>_EfYwk$s1)G#^6szP9WBZ#@44elSjj80$;;!M|S20r9uu z*_oDc3;b)~k3ke)CB#o8@v^RbVvgRHlzAYmOa9cm|F{0mJGF3E95d3?Ckj}d_@W^8 z{#RH|$FiHe)5?ec!XLNg3rVWXoqEW>D$l|!>tFUGE>D^@>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW4zA4DJ#)}pcL|ASUUOCbV8fCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I hhyW2F0z`la5CI}U1c(3;AOb{y2oM1x@ZTr!e*kSgciI2| literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test12.sas7bdat b/pandas/io/tests/sas/data/test12.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..e2a9db874948d00fb14f4f9e9dc1ab2288330aff GIT binary patch literal 196608 zcmeI2eRP%8mH(f6lThl9)nU4_9M(uRL(#!XX+qvBn1cjF1c?xlT7LaSjSjU4Da9@- zsFxSzO%ae*XkiM1ylBJ(0t5(f6QWIB45CC{1R+3>KmgIica+~g=j?Ny=RUXh+B<*D znwj;zF7DZPKj-yx_TFcoCpwP%sXI5dWMk?-zO`dvN9VhL$#|yAb)EmQTQ?`On-k0k z*lJ0E2z_SYhuxeX(9UZ^Nc&sorNSnO8?R4n>5D>G&un!r_y&PEnjXXeY%!EEpeO9(le;9_^8P zxbnGnj~w>Mk{hq(+$fLS-IdQ?^2jwFd6q{m_Q+|j+;ZL{S9|0c9=XUPcXj16Egreb zBZoZl5Rcr&l|N|q$Q2%Wibo#gkyBmybdyIe_sEkxa-m1=?8?nYJ@Q(QJkcWykKD}Igkx4W*)3nDUFZRf# z9y#5Wk6-r44IX)sM=tTmJze?O=N`G=y-Xm9g^+pDYTC} z3j=Cg$4Na(Gop`B-|koA5iR@mi(=@DW9U<3=o{aQ(SHnmaSVNG41MF_82!i47st@2 z#?UtsQTY+-+x=P;Lth+2pBh8ocu@Bl)qf0qaSVNG41ME)82!i47st@2#?Uvu8>9ai z`r;V+)EN54#u)v_&=<$hr^e7X?vK%b41IA7eQFGS<2y0>kD)J)p-+vWZ+tsO|1tE% zG4!c1^o{#s^dCcC97CV_EqXl)Wr8gHYevWNuJ<+<=%05BRkkk|3ocA4$o|DP)@Nz` zH&?Du<8;;qj{&?7USE=nIdRi~fxc#hLY|K49Krib5LF<|o%?k7juZbbKv-_2t4zqrw)^`bu z|JWlx+`rRJ>kn)Zm)A)U%ej6(tsl8Yyf|QU+t-b}E>W!Y*VpROtSij@-@9Afd4K0o z`Bmp5=Tl!UE)mV#*>7uoc(`sqaf$c~Y5SF2;QHOP{>o0~(4zHboSGNKZ^pGX$!|NTS*E_vh43yhD=`izWKIxB&T4|nbCs@z+`DR$OQ|+@ioMwH0-H+JF ze({0U3*O(!TLd}XuxDS`%ldnCecI39O*5}Pymt%tldJVP)nY$+wb(~jan)mCGQ&fz4y8Q z!Mfk>3&oA2pR4<%2it#WfYvuX;NzB|^?|VXw1;e9?7y$p&)*2`&zG@Zoa1rt z(*5k(CO(#7ZxruunEm?Km14YdB<2%h4mF#_&OiV2Pu}lt{Ah&kr^iNNjXKi&q*W`8 zwbN)Jx@n}w_Gr~su-0ugwz7I;pKJH>e%ltdj%sSvj{f{h#RQ5pM|od#JPaKUvtR6B zJ@Xv2Sv>o~I7yB<^Eq;GBkP%)@eA5FWzJ7T?qjH>PIEQ;>hQkYQz1T=$4foObF(ic z^CIhqIPRs*62I(IU8@LqYaZRhoJ z+*mwMs4(Ba@zeCvv{MYCXuJM4j`L1u-TyTkBj@P|{kzw0w(}1<%a#~OO zq0h%M?uY$%&~EYN6B68F9+&Nb>R&_N(qZbmT5rx-(px*VLJT{!&#mLwiq@R1Mp>_I zVQo2DuubhF)rV~w{oFpXEtFu@j{ZDy<}1n|%z4pQb1bhClhpxi@*>VFmcAselgID1 z=G^DJC2f^>ouVW;9`j^-zVj76N6dN6akyczP{+$Sj(cIYlgvtv=gi;uQ_CwtW+x55 z<#WopP0zD=8QX&|udA;R(%6PQdyx0>W?ldB?VQilvOZJmYb%91);{}?=g+_`!Cwy>!0m8?RVmjOXP?BI>dRxhH~~_b3XEVe_kp6U8c{u#vV9N4viLS zng@3?hYUU5xn0beIhc60J^VM$7i)*g1f#vfYHUSo)b^2TYQ4wWvK4Ga+lQ^JG*)d} z*ynbzNR6%N=uhF?vE(sqKjwZ>vrNcr;KMcM9A|$ST)}Z{4|BUgbL;jRpX0nQW`8^T z_R-`m2UhBKrk=z5NWb;{!q@}nZ{xSHzpy^c_7GYqexMw~#5d00_HX38dMD3Q$8+bg zDqlXy=i_(6k@q!||ImEMNh#%EKXNW{f0KpGCdYl>+?)7(>AZ~l=e*Rcx3NyhENbi- zzV|u3^!n+(qR+>(y5A6=M{h0{Dm?7ue9Um7G9v#G9G4Ew6DnFwG3ODV7xQOwK4$VI zJ~#J0FZA)n^-bRO%~qkp;Zytdd`!Mt_Lz{-YUiKl@cMb4-PW_PI4!tFbNYBinssANF~4i*NH6+tiL4Ifix@M_qqMGEcK#Q)`93*Kj;H z`_-_5&lh8#96!YZzHhRfn0)N%)#7)mqbba}x3-h6uL^mJ|GvN37vA^5<&l0A;(X~~ zUF1GGyzexxi1!l4k2;0CRb7xc z-iCPG+^y`t#vj>E?x_=<)CJ7=HT!!@EuUZPUm@0~REUW4-RP$*;d^>LbK`ToctzxW z-|Wlj9g*BvA9|;b@9CVsh4>r^O&0Q&NExW^-<%8KZ5$`x;Boo98@x*BxWVV3;Cz6_ zc}RWCxzFcp1Km&MrCxrl<;Ji>U5mc0!P*wK4=boT_Lr?_1>1+M6Dim^Sha0o1>2db zV_P`-^TQ)wP-bfOh0ocqckz3k66SV`-j5rr*shqH*{@q_cz^jmYvSs%Dz@9r+z+4c zt=ojob2#4!alZY=3Q?pkNG4BUyZWM*&o#bhnfpT3R-R{w`)B{6d8uphSQBsg9BluC z(D}CUYrgN?P%Y%!v72VHotyrPm$Cit)%~0I3`aIb+GmLEr^a_~8a|VE@cTD&PVsw^ zwTpfIaNIb*P&_W*PTp?LaX#0^tc!fFXwH}G>i9m+>vDL%IzG?$j#+yCg5RsGUn>@? zYp6K~`JQ6!-@FIVHsTC^mGf#7e|TRW*)9gF0AcdCEWMs{TZFYUYkt--lpR`wjTWL? zSX)+=BY(+mttN5|`O9`6StnX;Cu{}PnVk%yQ0dr5od1Vz)$2|FlTg>1p?ptwbehCM#_-yhY&JTP3L8#XfeR-ZC=CCNt{qy^FGk(QZz8^7XvoD9{@VRXAK+fyl z4U3EF^}jg>Ilpx_M&?VV{{fY}kH&xbeMs4KURMM2=Xr)h;ym42pK3MlOZol7y6r-r zFD7s2`J}FL{l(g;wL_(`25Z$;uqJ8+TUnW~?a>OhsjX<6T0uRs&ut6Uqx`auYzx)B zt>}0@hNH==cb0QLwvD-Qe9KwK@0ZMZ)I;0Z*d@L^Ia}+UBBA}!*iTQbpR}6q^=5xL zUcFi&BK?c+vpY8Fc4nTYoL9|xxbahd5AgU_-+9qnx35^r@4YMaxk1P zzn?ib`CJS0Jpa0h0zxOclc9b4BmENza7aYc}_?)eJEplBBpF0ojii}qw z?*FPfUwt=kTt#mU4zA?)?ar;b-iMW(cNu@@dq??djwj~tVw_J--o*QE=9#JcS+axw zj^@iN3@1}M>|Z~6$^H9_HNQx~nx{2bYyI|-wN)#qI<_O*)IPV5ti}qea`baMm>u5M zQ7vqHM}PGD5I&d9x^s8>@+gk;=D8`Ibj34ts#eIq>h0_H3i}topYQofh<;sj&EkZ^)E#Joy+{4_tG|wCr@i`rv9?Z$o&%9 z-$VaU$MfNH+1#_zck{W)@z9*J)StDwXggFUYM)z!wU%i$RePHtvOIhaJCJ+(nJTZKPNuf0o`WhLK`fAt_Fu8u8iQ!~Y}-NKtch+th;n zyECVW;;iH6ntR7z#4V)wRhm>x?a=-GpIjsQkz#EVEq>dH+t#N(c0%)e zp`NPjRjVi!eW=Q|OH}1)T6m}1x9KXC%RIzJ37UD`KS&&}^GL(x51=+B%6CwsI^zTN=?p_Jxyx-MhvAYn|A2+ z^X^v9qvr>CW2JpG-J`56iX|p&q~?B*X^Q6@?3v4Y4#{9{hi*1ntr4?s*Lns z#qcoI+4NWHMj2_R!Qvk3rZPZ^6AQ*ns7QNVj3ULxR8pMe-R(|_*Q$)c-@bWcSLXDm#`?l~(Do%QmQm*srPLZhHRGkJ|JGdcS9?4J2c@z{aCC`j2);t)NUx zRzClX)ybcy7TBLwIHgC3v^cMEwzwuYr=X6v{8qWDKc&;E45(ZgSA>iirzDw`2bJ?p zE~6?3IcAWzYk0;g?j}Q;NrrSFyI{(N1!E}6Oci74chzIk87IrgCFUNI8%$3pRQ!vM z2Ru`bP@4~#V?MQ+E;%;v?4*H& z!lXFd`qZ`6cbyk^kYf8f3Zo}?KQvX1u`0FgS-ZtL(#((iEn`ZI2*M^It?MjX0vC~1 z;TfiY_$|Kk>zpABqf``>wBPF(#zT5M6a6A!=3UN=Hqk z<`&YNXFnex*;g&2M&^u@Uc9Z9sx;jtnG6@hWR(?fkfvD~N|6pqwO>#pV@;i@(bg(b zg#4$;@v(E|hKU=f#vj_L6LVb17%r-Bpf)B@$xfCPQx$FGoy47Tkias*bsq$)9sR_jw@kd9fDA4q?_ut3}urYhl1k{;(*g|bn#%yV}9>EF&ZdOQpe47%UH`ZKYi#yFrls_p|c}J!y2Pog6 zIIE-TD&YkppOGBG$5~tia zP||^ST89GH7-p)VAS01Clz8pO)@_OmJzOWM-zIm|IR&*UJt-7-NY=}0Xf-D}n#-)O zVlXN8@WCP-{k3kA+NjPH3_jM>HgqLKF?+?@ovT;8tc1pv#wwh8X3Sy6u;zZl#0W03D6NnVOvDKGa0(8mZS)l$w#1tK(o~m@<^JDh>U$_NC=-Qlq!D?Wx7e zFUnOZDW;)xjG1?+ZC1f?c`{F^5T8sFGv`ycCJ7|R5YNk#_&BFV1||49}Zl{k|w38=ae7U8iZeKu(`i!>hB zV$Rc6uwV6+ds9x!ZRS)&TFgsJNpXRrjr6lsX|xuFhcZhQN?y5>G{-oss=Zj;K$??$ zBN`zYRc4arU7adxJA0*tI{ttyN2bEdnn_Wou4lPIo^2KKLUNF=Q8LhNm&tOic5xvy z%F0^m^+OI6lDzDCc7e9F;gqLRdiII*`s19OsB`M&X~v{wr{Qajz27Y-x=UV^T2(T4 zl?ni_ZlE!mbQYp#zEvji$7F`ywpk_l8;VR9$^(9vMkmhObxWrIQD!=H(~vzhtHbqr z9d{~!PCcB^mshpa(b8#lbMB+EgLBm8IImqDz~SxQK%@43VdUjTr#ulcMI)@KS&O6v6?~?1@Jct&hj$+DLrJrv+NQ=72 zN$hamF3K(`C!zyF!lfwP!dKy`Dif}dheKGV03$vZgJrMtN(^k3Hq4Ud_`ddX9m2QV zLc_kpqvTWUm_V_kk?(bMcNX``sK1@lV09+VTTD%ksUzurAydztO{92RU5*E-c(d^u zJ*xEP-M#2x6Ypn{w6XQd#yA%rA!k`Lkm~3l(NU$U6<^b!2Y3itJ6-yx%T_fUj8*Qo z`2lM64!eN7KCWre!-gmnNj`H5$~bM4VN&cKM4H8%|J)^XU5dVZ&+n!qws*TZ4A@&0 zA40xp!#l0*KsQ$gXTL5eX_hi4b>~vQeKq-VKd0awz62`P)zfK>hn4dTlxK=~G@TUY zIFN~9_)Sur<}0w=u#JM2`2lBw(r(0-$)qvwDrDlP9e)d7y5z;BI)|#XP?B-~(ETbu z)m2U^TPvXpKG|BOwY4tPVr~<)I4|Fsys=iOIR5fL(!8$jX}^)p>3Tkj=Jq~c`Q=Nb zh25!2vwRIR`bMFG-viQi%mSq^hvi-TysXjVQz3)w26?8KYu7+h)ZIj#yu~p}?d*o@ zsY)Z;7-dO%^WW1iBlJ|ZbfGHd6_89tmVHi&b9Abb?W^}t+jdd6C-mViUo=s`{Iy&V zXVA)>Hp>*joPZ;!myJEVafa>X#mGowgNha0d`4S_sxQAzS)1_&7dE@u%7D~YNs6i% zWuJ5!agrx*fXmxywkA`cd|hMVH)Zk%ZR#a?A73jonvY&qVQ1wrTJ#zH-a+R@tHx0` z=4v62n$a&q&rcV{=@fSHY zlD=Cm54cvo@W_+%wI7iptP=GhVk9ZTUFe`_tlKl~KLoj|*m8iLFK7RjXYZPkG)S{N zW(K^d4YKxnZR*nmWjEyi_fm`VGLydlP9cXVucsEA1nXRS$waDhfiDMgl$}?oN{gPk zHl!D8NOM73IVa#>lI9{?k~$VQNdOl)ca~neM7|d|##x;**>!#R^$qVK7jj#hUbBYs z_XyIM+z937DrdM$U$oL;%CGeQ*1^eRaVM`_`RW_{Cc6_!Y4#Th9VR--^j#*u-OsnQ zDN$`k$7%Cj>P!B!pAJP%fW{djzunKbj3d-Ied3H0y`FT{re{KJ(o~zSaoVKNoaI0J z>CjoNr&B`fapVXom*b2RwVsqqs?GU?+BB&)N8_}K+MkqtawREy5?N15SdCK?XPoHu zRH!!P3AI_S+ANLJCVD;d)q0*uXgwh{&XhRgM6XAAPRiJX+LWkqM#pIry&mO1DGB*c zicsV9i8D_0dX)d9B;-FSX= zCwe`~f07gOpX3rX&geMfMDLICpX7x6Ct0X*`otM0dOga2k`wZu#u+DSe}c+?f(iLgFr>zr5@(#~^(g-d zCgeZC5;e}~IO9aGNBK`MA^!;qHBO&6<3z7V`A;w*{|Tn4ak|DCCwe`~e}W15PtcJg z1TM!JCu%(bY=0@}EFhjZ+h6oapr^{|O}IKY`_HoTYKb ziC&NLpFl$X69}nsrorws_NXUNzLXFcW&N$KQQT`K1 z$bSN9YMicd#)*p80p&k|g#3pt=;S}n61i_XHEM+FIO9a^kE1t!IiFVN#rNqW4F8 zPH95>GfIt69A}*9^$b!gDNJZRd1{0#|2S7JCs%u|$?2G^x($vZ?RS$Mit~=sQU23< zr?W@y;>yAMNH+D;T)or7Bd5D^@L`fo{XAFi2#-9-m4m+_Ifds_z?|;)dvQ7$;^|^cy|tKJ#vLB2QQLr`mc8Nl!v%&8(cZ~ z8Of&pK35+&0k;`T-+jZF?naflzyK|YvWg(ZvT$XzOhDR>*b%#mHuI1McM)Vu;vwQmwACl(# z6!t6bH==kzQUCE{AAMw8hI8wH5ykSK{@vT@PL1V1{X5h5Jj)q6w6O4JKXa5`*U9$P z$?^4(>wBK(`EoB_n_rfXUzTrvSw4PQzWHVO_+|O#m*wM^<(prYk6)H=e%U^L*}nN@`}k%1 z=9lf`m+hNhwvS)7Z+_W6e%ZeH<@osJ_~w`6*JT}n_sSvU#@R{xjufmzWL?)_~rWMm+Rw~>ziMmk6)f|etABAdA|AO`S|7e=9lN= zm*<;bo{wLiZ+`hce)+!n<@@;M`{tML&09We=C0{cT4{%{Wb7L66IS7`H@My zs;hoENnJcCbAMWw`sio>y}sw4?ek0mGYaTe6tp_|MnUfVuehAZ<#*JbR{i)pzB+o| zkaShKQz!MU^DNG?zO^5Dc?x(luD{vB?3H||t&^(}gXcUggLl=XUCKF zHv|v>0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5cpq2;3`^6z?t~JXhm2G2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=9 z00@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p z2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?x jfB*=900@8p2!H?xfB*=900@8p2!H?xfB*>m=L!6OLuo81 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test13.sas7bdat b/pandas/io/tests/sas/data/test13.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..b1dc6f9f8eddc611a3c18d412d173660dd8b120c GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test14.sas7bdat b/pandas/io/tests/sas/data/test14.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..5a958df51f0ce029ceeb9b0c171c9508144c38b6 GIT binary patch literal 196608 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test15.sas7bdat b/pandas/io/tests/sas/data/test15.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..c028d8041a3d3dd2849b6b3bdeaa1dd94c22018b GIT binary patch literal 196608 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test16.sas7bdat b/pandas/io/tests/sas/data/test16.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..867c3c51bbdddf25b39e2b17e1bf0b406fb263b2 GIT binary patch literal 73728 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 qS|j76TjvnYn4VUq_5b=<`258#&DY literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test2.sas7bdat b/pandas/io/tests/sas/data/test2.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..ba0b8e8dcbb91de3f8f919a2465393c1bff9c2be GIT binary patch literal 196608 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 zN<#cfLgOn5@hb_9uO!5;Bs9Lkxw-m`urb7*L4khxq%(+8HcXIn@T&6+NHwn7*qrlqIeP7OxY4-Z8*8lVr_+rI>v!A(-?WjH5A<>Lzu2kMF zj zUbWhuy1h4kWuK!20T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5CDPy$pp^pp=USc zfAS15HxK{;5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X s009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!XIC}#B2Mu)>?EnA( literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test3.sas7bdat b/pandas/io/tests/sas/data/test3.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..a061b1ddd0d45f93cf1c9a6c89a1bef6f71fa8ab GIT binary patch literal 196608 zcmeI24Rlo1wfN7ynS78&8ZeL2n#z<$8*7Ro-w4qI1Pl-$n20H*G}erdYDQAZxKNn( zT8*LzhL1*2Qes6uG-?770tT3bpy;z2Aqo~hLV=2cLZ7s1ADXw%x%=KZbEla)|F!;W z{r_G2y0~Z0zWaRr&fe$jdn04PtMj9~E4QT#dVTlG1UBHMkq-?WmON>5c6Uxf7-T&uT(b)2_qW1awhZU~=>7T}0rR-<* z8-ZXcy4IL3?^4S~jmXT&965Dl$uDmAEi_f~o;4zGM0VDXa`UrC>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&I{y!k_{oD4}S;O4WDI_2K$C&#o#(Fgn;9m;JN#YU6 zCoV9SiTcXFGj?yBsn7V7v78uFp8E-7T`p730XYXmQI{$5s~-pTYZSRkkuw$f!kM7` z0YzS|$d!tmp~#<~4%Y2brrO4gK zf_2v^@?1sEQDmmbul5G(u2JMFMb1>@3-1T*4=D0#MXprj3`PF@y=puDArvHwE3_aI|0qx>Il1oh)zXY3&AfBi?s_M^Px zzZiQ7<-V60YeTu%M0 z>T^u}SABh8Ts8Xrdi+aYnPX5$i4^I7g@@BM8HSOPff^Tg&yXnO#ADDV$imAVS z13&)cV_oj%PP9)m_3n-Q_0P)Sku{#7Qg0mZG@oOCjEymWAL`)u1YUW3!uF%sPM)cM zelIuY)r0*`GxZan;xoBAI<$4l}b7+ZNVfclxH zerSOI@l|nQ`)s(We`^Q7utk7qMEkL(e�rhY8z1{jvw=#mi0oWgTW|%`1TI&)UbQ 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test4.sas7bdat b/pandas/io/tests/sas/data/test4.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..addd6edf90830b320270ae03ce68afc85088139b GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test6.sas7bdat b/pandas/io/tests/sas/data/test6.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..2d9b4b0466047481d0fa63bbb29c2d3b234326bc GIT binary patch literal 196608 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test7.sas7bdat b/pandas/io/tests/sas/data/test7.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..785b12cf175e39d9a7aa73475f6ebc8ffec3a8c3 GIT binary patch literal 131072 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 z z8*(4yA;_bU6DOd4$f=OiAzL8lPSEQM=1nNxz`3kr>|FM~GVwIcNY9v)o;mxBi`p-_ za6zSa`ph}$@SjOn1+y)jah_+=)gr&fJNxXWrq2b3#4(#%QKnA#s2BMSBHbv`l@-x8 zR8~gYSXmWsLuIunQzLxTiu^i}t{3SBVc!_duc{Df(Z;H(sC|`aUsa8;7wxO66ZWEg zRSm*kw69t)tQPI7u8P`Mi}qCue$}FV)q-EOXkWG9S1sCCBly*b_SFb}HKKhrf?thj zUya~bBidIZ_|=H^)e3&KqJ6c3U#)0gt>9NH+E*+1)r$7j3VyYseRYCgooHX3;8!Qw zS10(@iT2eAes!XKb%I}=XkWeHS1;OEFZk7q_SFl1^`d?Cf?vI8U%lX0FWT22_%(?3 zH3)tUqJ0g5UxR30gW%U7+SefXHHh{#3Vw~EeT{-&qiA2F;MXYH*C_ZkiuN@MevP7i zl@%4i9%0vz;C1Z5#{s(s6(h%-;l_&nU%gF)WBX0Qo+j-UDARV2w0he;%o_DJ=d5gHV IUDsv)2jy@;?EnA( literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test8.sas7bdat b/pandas/io/tests/sas/data/test8.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..67db5a143de07fed6a733e602d70c3344da236a0 GIT binary patch literal 196608 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 Y2oM1xKm>>Y5g-CYfCvzQ|8oNW19*37QUCw| literal 0 HcmV?d00001 diff --git a/pandas/io/tests/sas/data/test9.sas7bdat b/pandas/io/tests/sas/data/test9.sas7bdat new file mode 100644 index 0000000000000000000000000000000000000000..d76a1f28033f47520f110d73b74f63b9b51fedcd GIT binary patch literal 196608 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