def proc(self, context: CommandContext): rows = [] sql = self.__params.main_sql # Rowラッパーに変換 rows = [] if self.__params.batch_count <= 0: # まとめてインサート rows = [Row(row) for row in context.get_rows()] if len(rows) > 0: self.__dbService.execute_updates(self.__cursor, sql, rows) self.__db.commit() logger.info(f"executed {len(rows)} parameters..") else: # 指定件数ずつまとめて実行 insRows = [] for row in context.get_rows(): insRows.append(Row(row)) if len(insRows) == self.__params.batch_count: rows = rows + insRows self.__dbService.execute_updates(self.__cursor, sql, insRows) logger.info(f"executed {len(insRows)} parameters.") insRows = [] self.__db.commit() if len(insRows) > 0: rows = rows + insRows self.__dbService.execute_updates(self.__cursor, sql, insRows) logger.info(f"executed {len(insRows)} parameters.") # 次のコマンドへ引渡し context.set_rows(rows)
def validate(self, params): # パラメータ定義のrequire: noのデフォルト値を取得する defaultValue = {} for key in self.specs.keys(): spec = self.specs[key] if spec.require == False: if not key in params: params[key] = spec.default r = Row(params) # 必須プロパティチェック for v in self.requires: if r.get(v.name) == None: raise Exception( f'{self.commandName}: {v.name}プロパティが設定されていません。') # パラメータのキーを取得 for key in params.keys(): # パラメータ仕様にないパラメータ if not key in self.specs: raise Exception( f'{self.commandName}: {key}プロパティは、パラメータ仕様に定義されていません。') # 値を取得 value = r.get(key) # 値のチェックを行う self.specs[key].validate(value)
def proc(self, context: CommandContext): """ メイン処理を行います。 context.get_rows()を呼び出して、データ行を取得しながら、 データ加工を行ってください。 渡されてくるデータは、イテレータの場合もあるので、次に 引き継ぐために、context.set_rows()で、データを引き渡してください。 """ # 次へ引き渡す行 rows = [] for row in iter(context.get_rows()): # Rowラッパーに変換 row = Row(row) if self.__write_header == False: self.__write_header = True headers = self.__params.headers if len(self.__params.headers) == 0: headers = row.keys() self.__headers = headers if self.__params.header: self.__writer.writerow(headers) rows.append(row) # 行を追加 self.__writer.writerow([row.get(x) for x in self.__headers]) # 次のコマンドへ引渡し context.set_rows(rows)
def proc(self, context: CommandContext): targets = self.__args.target_keys newRows = [Row(row) for row in context.get_rows()] if len(newRows) == 0: return rowColumns = [len(r.keys()) for r in newRows] index = rowColumns.index(max(rowColumns)) if len(newRows) == 0: return if len(targets) == 0: targets = newRows[index].keys() table = prettytable.PrettyTable(targets) # アラインの設定 for key in targets: val = newRows[0].get(key) table.align[key] = 'l' if type(val) == int: table.align[key] = 'r' if type(val) == bool: table.align[key] = 'c' for row in newRows: table.add_row([row.get(target) for target in targets]) print(table) context.set_rows(newRows)
def proc(self, context: CommandContext): """ メイン処理を行います。 context.get_rows()を呼び出して、データ行を取得しながら、 データ加工を行ってください。 渡されてくるデータは、イテレータの場合もあるので、次に 引き継ぐために、context.set_rows()で、データを引き渡してください。 """ # 次へ引き渡す行 rows = [] for row in iter(context.get_rows()): # Rowラッパーに変換 row = Row(row) print(row) rows.append(row) # 次のコマンドへ引渡し context.set_rows(rows)
def proc(self, context: CommandContext): """ メイン処理を行います。 context.get_rows()を呼び出して、データ行を取得しながら、 データ加工を行ってください。 渡されてくるデータは、イテレータの場合もあるので、次に 引き継ぐために、context.set_rows()で、データを引き渡してください。s """ # 親データを保存 if self.__iter_parent == None: self.__iter_parent = iter([row for row in context.get_rows()]) self.__has_parent_data = True # 親から1行取得する if self.__iter_current == None: try: self.__parent_row = {} if self.__has_parent_data: self.__parent_row = Row(next(self.__iter_parent)) except StopIteration: self.__has_parent_data = False self.__iter_parent = None context.set_rows([]) return if self.__iter_current == None: # このコマンドが提供するデータの取得処理を行う。 # 例)ファイルをオープンして、データを読み込む if not self.__has_parent_data: self.__has_current_data = False context.set_rows([]) return # データ取得処理 newRows = [] newRows = self.get_new_data(self.__parent_row) # 取得したデータを、未加工のまま次の処理へ self.__iter_current = iter(newRows) retRows = [] while True: try: row = {} row = next(self.__iter_current) except StopIteration: self.__iter_current = None self.__has_current_data = False context.set_rows(retRows) return # 返却データを追加 newRow = self.create_new_row(row) if newRow == None: continue retRows.append(newRow) # フェッチサイズに達したらwhileループ終了 if self.__fetch_size > 0 and len(retRows) == self.__fetch_size: break # データを設定 context.set_rows(retRows)
def validate_spec(commandName: str, specDict: dict, logger) -> dict: spec = Row(specDict) if spec.get('name') == None: logger.error(f'{commandName}.yml: nameプロパティが定義されていません') if spec.get('comment') == None: logger.error(f'{commandName}.yml: commentプロパティが定義されていません') if spec.get('parameters') == None: logger.error(f'{commandName}.yml: parameterプロパティが定義されていません') if spec.get('sample') == None: logger.error(f'{commandName}.yml: sampleプロパティが定義されていません') ret = ArgSpecs(commandName) for name in spec.get('parameters').keys(): param = Row(spec.get('parameters')[name]) if param.get('type') == None: logger.error(f'{commandName}.yml: {name}.typeが指定されていません') checkTypes = [] if type(param.get('type')) == str: checkTypes.append(param.get('type')) elif type(param.get('type')) == list: checkTypes = param.get('type') if len(checkTypes) > 0: for typeValue in checkTypes: if not typeValue in [ 'string', 'int', 'bool', 'enum', 'list', 'object', 'dict' ]: logger.error( f'{commandName}.yml: {name}.type は、string,int,bool,enum,list,dict,objectの何れかを指定してください' ) if param.get('type') == 'enum': if param.get('values') == None: logger.error( f'{commandName}.yml: {name}.type がenumの時は、列挙値をvaluesに配列で記述してください' ) if param.get('comment') == None: logger.error( f'{commandName}.yml: {name}.comment が定義されていません。パラメータの説明を記述してください' ) if param.get('require') == None: logger.error(f'{commandName}.yml: {name}.require が定義されていません。') if param.get('default') == None: logger.error(f'{commandName}.yml: {name}.default が定義されていません。') ret.append( ArgSpec(name, param.get('type'), param.get('values'), param.get('comment'), param.get('require'), param.get('default'))) return ret
def proc(self, context: CommandContext): """ メイン処理を行います。 context.get_rows()を呼び出して、データ行を取得しながら、 データ加工を行ってください。 渡されてくるデータは、イテレータの場合もあるので、次に 引き継ぐために、context.set_rows()で、データを引き渡してください。 """ # 正規表現取得 reg = self.__reg # マッチングターゲットキーを取得 target_key = self.__params.target_key # 結果格納用のキーを取得 match_result_key = self.__params.match_result_key # 出力用のフィールド output = self.__params.output_keys # 次へ引き渡す行 rows = [] for row in iter(context.get_rows()): if type(row) == dict: row = dict(row) if type(row) == Row: row = dict(row.raw()) # Rowラッパーに変換 row = Row(row) row.set(match_result_key, False) # 検索対象文字列を取得 line = row.get(target_key) if line == None: continue newRow = dict(output) # 正規表現マッチング pos = None matchResult = reg.match(line) if matchResult: # マッチ結果を保存 row.set(match_result_key, True) # グループ1の発見場所を保存 groups = matchResult.groups() if len(groups) > 0: pos = matchResult.start(1) if len(groups) > 0: # 正規表現のマッチング結果を、置換します。 if self.__params.extract_type == 'index': for key in self.__params.group_key_map: index = int(self.__params.group_key_map[key]) newRow[key] = groups[index - 1] else: # ?Pで指定された正規表現のマッチ結果を抽出 d = matchResult.groupdict() for key in d.keys(): newRow[key] = d[key] elif self.__params.skip_unmatch: continue row.set('pos', pos) # 結果をマージ for key in newRow.keys(): row.set(key, newRow.get(key)) rows.append(row.raw()) # 次のコマンドへ引渡し context.set_rows(rows)