From 23810e583b81cfca4b0f51fa8a46635c83099567 Mon Sep 17 00:00:00 2001 From: Kerby Shedden Date: Sun, 10 Jan 2016 16:13:07 -0500 Subject: [PATCH] ENH: Support for reading SAS7BDAT files closes #4052 closes #12015 --- LICENSES/SAS7BDAT_LICENSE | 19 + asv_bench/benchmarks/packers.py | 20 +- doc/source/io.rst | 33 +- doc/source/whatsnew/v0.18.0.txt | 8 + 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, 1328 insertions(+), 91 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..bbfa711eb4445 100644 --- a/doc/source/io.rst +++ b/doc/source/io.rst @@ -2554,7 +2554,7 @@ both on the writing (serialization), and reading (deserialization). +----------------------+------------------------+ | 0.18 | >= 0.18 | +======================+========================+ - + Reading (files packed by older versions) is backward-compatibile, except for files packed with 0.17 in Python 2, in which case only they can only be unpacked in Python 2. .. ipython:: python @@ -4198,7 +4198,7 @@ Authenticating with user account credentials is as simple as following the promp which will be automatically opened for you. You will be authenticated to the specified ``BigQuery`` account using the product name ``pandas GBQ``. It is only possible on local host. The remote authentication using user account credentials is not currently supported in Pandas. -Additional information on the authentication mechanism can be found +Additional information on the authentication mechanism can be found `here `__. Authentication with service account credentials is possible via the `'private_key'` parameter. This method @@ -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 (v0.18.0). -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 aab9e6125732a..b3bbc5cf5ef8c 100644 --- a/doc/source/whatsnew/v0.18.0.txt +++ b/doc/source/whatsnew/v0.18.0.txt @@ -24,6 +24,7 @@ Highlights include: since 0.14.0. This will now raise a ``TypeError``, see :ref:`here `. - The ``.to_xarray()`` function has been added for compatibility with the `xarray package `__, see :ref:`here `. +- The ``read_sas`` function has been enhanced to read ``sas7bdat`` files, see :ref:`here `. - Addition of the :ref:`.str.extractall() method `, and API changes to the :ref:`.str.extract() method ` and :ref:`.str.cat() method `. @@ -403,6 +404,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. +.. _whatsnew_0180.enhancements.sas: + +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 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 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 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 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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