You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
6.9 KiB
Python
200 lines
6.9 KiB
Python
5 years ago
|
"""
|
||
|
(c) 2019 EDI-Parser 1.0
|
||
|
Vanderbilt University Medical Center, Health Information Privacy Laboratory
|
||
|
https://hiplab.mc.vanderbilt.edu/tools
|
||
|
|
||
|
|
||
|
Authors:
|
||
|
Khanhly Nguyen,
|
||
|
Steve L. Nyemba<steve.l.nyemba@vanderbilt.edu>
|
||
|
|
||
|
License:
|
||
|
MIT, terms are available at https://opensource.org/licenses/MIT
|
||
|
|
||
|
This parser was originally written by Khanhly Nguyen for her internship and is intended to parse x12 835,837 and others provided the appropriate configuration
|
||
|
USAGE :
|
||
|
- COMMAND LINE
|
||
|
|
||
|
- EMBEDDED
|
||
|
"""
|
||
|
import os
|
||
|
import sys
|
||
|
def split(row,sep='*',prefix='HI'):
|
||
|
"""
|
||
|
This function is designed to split an x12 row and
|
||
|
"""
|
||
|
if row.startswith(prefix) is False:
|
||
|
value = []
|
||
|
for row_value in row.replace('~','').split(sep) :
|
||
|
|
||
|
if '>' in row_value :
|
||
|
if row_value.startswith('HC') or row_value.startswith('AD'):
|
||
|
|
||
|
value += row_value.split('>')[:2]
|
||
|
else:
|
||
|
value += row_value.split('>')
|
||
|
else :
|
||
|
value.append(row_value)
|
||
|
return [xchar.replace('\r','') for xchar in value] #row.replace('~','').split(sep)
|
||
|
else:
|
||
|
|
||
|
return [ [prefix]+ split(item,'>') for item in row.replace('~','').split(sep)[1:] ]
|
||
|
def get_config(config,row):
|
||
|
"""
|
||
|
This function will return the meaningfull parts of the configuration for a given item
|
||
|
"""
|
||
|
_row = list(row) if type(row[0]) == str else list(row[0])
|
||
|
_info = config[_row[0]] if _row[0] in config else {}
|
||
|
key = None
|
||
|
if '@ref' in _info:
|
||
|
key = list(set(_row) & set(_info['@ref'].keys()))
|
||
|
if key :
|
||
|
key = key[0]
|
||
|
return _info['@ref'][key]
|
||
|
else:
|
||
|
return {}
|
||
|
|
||
|
if not _info and 'SIMILAR' in config:
|
||
|
#
|
||
|
# Let's look for the nearest key using the edit distance
|
||
|
if _row[0] in config['SIMILAR'] :
|
||
|
key = config['SIMILAR'][_row[0]]
|
||
|
_info = config[key]
|
||
|
return _info
|
||
|
def format_date(value) :
|
||
|
year = value[:4]
|
||
|
month = value[4:6]
|
||
|
day = value[6:]
|
||
|
return "-".join([year,month,day])[:10] #{"year":year,"month":month,"day":day}
|
||
|
def format_time(value):
|
||
|
return ":".join([value[:2],value[2:] ])[:5]
|
||
|
def format_proc(value):
|
||
|
if ':' in value :
|
||
|
return {"procedure_type":value.split(':')[0].strip(),"procedure_code":value.split(':')[1].strip()}
|
||
|
else:
|
||
|
return value
|
||
|
|
||
5 years ago
|
VERSION = x12_file[1].split('*')[-1].replace('~','')
|
||
|
|
||
|
row = split(x12_file[3])
|
||
|
_info = get_config(config,row)
|
||
5 years ago
|
else:
|