Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    def proc(self, context: CommandContext):
        """
        メイン処理を行います。
        context.get_rows()を呼び出して、データ行を取得しながら、
        データ加工を行ってください。

        渡されてくるデータは、イテレータの場合もあるので、次に
        引き継ぐために、context.set_rows()で、データを引き渡してください。

        """

        # 次へ引き渡す行
        rows = [row for row in context.get_rows()]
        if len(rows) == 0:
            return rows

        if type(rows[0]) == Row:
            rows = [row.raw() for row in rows]

        output_path = self.__params.output.format(**rows[0])

        # テンプレートを適用
        result = self.__template.render(rows=rows, args=self.__params.args)
        with open(output_path, 'w') as f:
            f.write(result)

        # 次のコマンドへ引渡し
        context.set_rows(rows)
Example #4
0
    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)
Example #5
0
    def proc(self, context: CommandContext):
        """
        メイン処理を行います。
        context.get_rows()を呼び出して、データ行を取得しながら、
        データ加工を行ってください。

        渡されてくるデータは、イテレータの場合もあるので、次に
        引き継ぐために、context.set_rows()で、データを引き渡してください。
        """

        rows = []
        for row in context.get_rows():
            if type(row) == Row:
                rows.append(objdict(row.raw()))
            else:
                rows.append(objdict(row))

        local = {
            'input_rows': rows,
            'output_rows': [],
            'args': self.__params.args
        }

        # スクリプトの実行を行う
        try:
            exec(self.__script, self.__modules, local)
        except Exception as e:
            logger.error(e)
            raise e

        # 次のコマンドへ引渡し
        context.set_rows(local['output_rows'])
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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)