# -*- coding: utf-8 -*- #!/usr/bin/env python from __future__ import absolute_import, print_function import sys import getopt import os import csv from base import RAW_DIR, TARGET_DIR, create_csv OCT_RAW_DIR = os.path.join(RAW_DIR, '..', 'oct') verbose = False writefile = False def process_lo_data4search(model=None): ''' return group of LO by model if not asking for model, return dict with all models + LO ''' groupy = {} with open(os.path.join(OCT_RAW_DIR, 'LO_DataFor_Search.csv'), 'rU') as f: ''' PEP278 explained what rU stands for: In a Python with universal newline support open() the mode parameter can also be "U", meaning "open for input as a text file with universal newline interpretation". Mode "rU" is also allowed, for symmetry with "rb". ''' rows = csv.reader(f) for row in rows: if row[1] not in groupy: groupy[row[1]] = [] groupy[row[1]].append(row) if not model: return groupy elif model in groupy: return groupy[model] else: return [] def get_lo_list_from_part7(model=None, rtype=None): ''' Fetch data from part 7 putting in List for easy access ''' if not model and not rtype: return [] result = [] filename = '%s-%s.csv' % (model, rtype) with open(os.path.join(TARGET_DIR, 'part7', filename), 'rb') as f: rows = csv.reader(f) for row in rows: result.append(row) return result def isMatch(a, b): ''' ----> one limit : b needs to be 1-char since it will complicate things too much possibility: Y/N* --- N, Y ''' match = False aa = a.replace('*', '').split('/') if b in aa: return True return False def get_matched_lo_list(los, ros): COMPARSION_PAIR = [ # ใส่ไป (#R, #LO) คือ (5, 2), (6, 3), (7, 6), (8, 7), (9, 10), (10,12), (11,13), (12,15), (13,17), (14,18), (15,19), (16,21) ,(17, 22), (18, 24), (19, 27), (20, 29), (21, 30), (22, 31), (23, 33) ] ok = [] isMatched = False for lo in los: if verbose: print('\n----------------------------------------------') for ro in ros: if isMatched: continue # check if all columns are matched count = 0 for r, l in COMPARSION_PAIR: if isMatch(ro[r], lo[l]): # print('MATCHED: %s === %s' % (ro[r], lo[l]), end=' | ') if verbose: print('_', end='') count += 1 else: # print(' X : %s !== %s' % (ro[r], lo[l]), end=' | ') if verbose: print('X', end='') # if matched column count == len(COMPARSION_PAIR), then it's a match if count == len(COMPARSION_PAIR): isMatched = True if verbose: print('\n%s %s ==> %s | matched pair #%s/%s' % ( lo[0], ro[0], isMatched, count, len(COMPARSION_PAIR))) if isMatched: ok.append(lo) # reset match boolean isMatched = False return ok def startProcessingS10(model, rtype): data4search = process_lo_data4search(model) part7data = get_lo_list_from_part7(model, rtype) output = get_matched_lo_list(data4search, part7data) print('==============================================') print('output: #%s' % len(output)) if len(output): print([l[0] for l in output]) if writefile: output_name = '%s-%s.csv' % (model, rtype) create_csv(output_name, output, directory='part10') def usage(): print( '''Help: [opts] -m, --model Model Name -r, --rtype R_Type -v verbose -w write output to file Usage: $ python s10.py [opts] [value] Example: $ python s10.py -mCFHD -r3 $ python s10.py -mCFHD -r3 -v << show more information $ python s10.py -m CFHD -r 3 -v << same as above $ python s10.py --model=CFHD --rtype=3 -v << same as above $ python s10.py -m CFHD -r 3 -w << write output file too. $ python s10.py -mCFHD -r3 -vw << show more information & output file. ''') def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'm:r:vw', ['model=', 'rtype=']) except getopt.GetoptError: usage() sys.exit(2) model_value = rtype_value = None for opt, arg in opts: if opt == "-v": global verbose verbose = True elif opt == "-w": global writefile writefile = True elif opt in ('-m', '--model'): ## TODO: filter model availabel and throw exception if invalid if len(arg) != 4: usage() sys.exit(2) model_value = arg.upper() elif opt in ('-r', '--rtype'): if arg not in '1234': usage() sys.exit(2) rtype_value = arg print('[s10] model: %s | r_type: %s' % (model_value, rtype_value)) startProcessingS10(model_value, rtype_value) if __name__ == '__main__': main()