From 7ee6bfe9752a888c3f9c4fee3ea2d251050663ef Mon Sep 17 00:00:00 2001 From: Douglas Bastos Date: Wed, 24 Jul 2019 10:02:40 -0300 Subject: [PATCH 1/2] Update regex to read tables and columns with spaces --- pandas_access/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pandas_access/__init__.py b/pandas_access/__init__.py index 9fffccb..f9cda50 100644 --- a/pandas_access/__init__.py +++ b/pandas_access/__init__.py @@ -7,11 +7,10 @@ except ImportError: from io import BytesIO - -TABLE_RE = re.compile("CREATE TABLE \[(\w+)\]\s+\((.*?\));", +TABLE_RE = re.compile("CREATE TABLE \[([a-zA-Z_0-9 ]+)\]\s+\((.*?\));", re.MULTILINE | re.DOTALL) -DEF_RE = re.compile("\s*\[(\w+)\]\s*(.*?),") +DEF_RE = re.compile("\s*\[([a-zA-Z_0-9 ]+)\]\s*(.*?),") def list_tables(rdb_file, encoding="latin-1"): From 044b8774c036f2692ca1aceed14feb2387def05d Mon Sep 17 00:00:00 2001 From: Douglas Bastos Date: Wed, 24 Jul 2019 14:32:36 -0300 Subject: [PATCH 2/2] Fix list_tables to return all tables correctly --- pandas_access/__init__.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pandas_access/__init__.py b/pandas_access/__init__.py index f9cda50..c298cb5 100644 --- a/pandas_access/__init__.py +++ b/pandas_access/__init__.py @@ -7,6 +7,7 @@ except ImportError: from io import BytesIO + TABLE_RE = re.compile("CREATE TABLE \[([a-zA-Z_0-9 ]+)\]\s+\((.*?\));", re.MULTILINE | re.DOTALL) @@ -21,8 +22,8 @@ def list_tables(rdb_file, encoding="latin-1"): actually be UTF-8. :return: A list of the tables in a given database. """ - tables = subprocess.check_output(['mdb-tables', rdb_file]).decode(encoding) - return tables.strip().split(" ") + tables = get_tables(rdb_file, encoding) + return [table for table, _ in tables] def _extract_dtype(data_type): @@ -47,6 +48,11 @@ def _extract_defs(defs_str): defs[m.group(1)] = m.group(2) return defs +def get_tables(rdb_file, encoding='utf8'): + output = subprocess.check_output(['mdb-schema', rdb_file]) + lines = output.decode(encoding).splitlines() + schema_ddl = "\n".join(l for l in lines if l and not l.startswith('-')) + return TABLE_RE.findall(schema_ddl) def read_schema(rdb_file, encoding='utf8'): """ @@ -55,12 +61,9 @@ def read_schema(rdb_file, encoding='utf8'): spits out UTF-8, exclusively. :return: a dictionary of table -> column -> access_data_type """ - output = subprocess.check_output(['mdb-schema', rdb_file]) - lines = output.decode(encoding).splitlines() - schema_ddl = "\n".join(l for l in lines if l and not l.startswith('-')) - + tables = get_tables(rdb_file, encoding) schema = {} - for table, defs in TABLE_RE.findall(schema_ddl): + for table, defs in tables: schema[table] = _extract_defs(defs) return schema