Mercurial > repos > iuc > query_tabular
comparison filters.py @ 13:cf34c344508d draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/query_tabular commit 35576d64a12fa664d72559172c5960c09da2b632"
author | iuc |
---|---|
date | Thu, 19 Aug 2021 19:40:53 +0000 |
parents | 83069b38aa85 |
children | cf4397560712 |
comparison
equal
deleted
inserted
replaced
12:623f3eb7aa48 | 13:cf34c344508d |
---|---|
2 | 2 |
3 from __future__ import print_function | 3 from __future__ import print_function |
4 | 4 |
5 import re | 5 import re |
6 import sys | 6 import sys |
7 from itertools import chain | |
7 | 8 |
8 | 9 |
9 class LineFilter(object): | 10 class LineFilter(object): |
10 def __init__(self, source, filter_dict): | 11 def __init__(self, source, filter_dict): |
11 self.source = source | 12 self.source = source |
12 self.filter_dict = filter_dict | 13 self.filter_dict = filter_dict |
13 self.func = lambda i, l: l.rstrip('\r\n') if l else None | 14 self.func = lambda i, l: l.rstrip('\r\n') if l else None |
14 self.src_lines = [] | 15 self.src_lines = [] |
15 self.src_line_cnt = 0 | 16 self.src_line_cnt = 0 |
17 | |
18 def xint(x): | |
19 if isinstance(x, int): | |
20 return x | |
21 try: | |
22 return int(x) | |
23 except Exception: | |
24 return x if x else None | |
25 | |
16 if not filter_dict: | 26 if not filter_dict: |
17 return | 27 return |
18 if filter_dict['filter'] == 'regex': | 28 if filter_dict['filter'] == 'regex': |
19 rgx = re.compile(filter_dict['pattern']) | 29 rgx = re.compile(filter_dict['pattern']) |
20 if filter_dict['action'] == 'exclude_match': | 30 if filter_dict['action'] == 'exclude_match': |
26 elif filter_dict['action'] == 'include_find': | 36 elif filter_dict['action'] == 'include_find': |
27 self.func = lambda i, l: l if rgx.search(l) else None | 37 self.func = lambda i, l: l if rgx.search(l) else None |
28 elif filter_dict['filter'] == 'select_columns': | 38 elif filter_dict['filter'] == 'select_columns': |
29 cols = [int(c) - 1 for c in filter_dict['columns']] | 39 cols = [int(c) - 1 for c in filter_dict['columns']] |
30 self.func = lambda i, l: self.select_columns(l, cols) | 40 self.func = lambda i, l: self.select_columns(l, cols) |
41 elif filter_dict['filter'] == 'select_column_slices': | |
42 cols = [x if isinstance(x, int) else [y if y is not None else None for y in [xint(k) for k in x.split(':')]] for x in [xint(c) for c in filter_dict['columns']]] | |
43 if all([isinstance(x, int) for x in cols]): | |
44 self.func = lambda i, l: self.select_columns(l, cols) | |
45 else: | |
46 cols = [slice(x[0], x[1], x[2] if len(x) > 2 else None) if isinstance(x, list) else x for x in cols] | |
47 self.func = lambda i, l: self.select_slices(l, cols) | |
31 elif filter_dict['filter'] == 'replace': | 48 elif filter_dict['filter'] == 'replace': |
32 p = filter_dict['pattern'] | 49 p = filter_dict['pattern'] |
33 r = filter_dict['replace'] | 50 r = filter_dict['replace'] |
34 c = int(filter_dict['column']) - 1 | 51 c = int(filter_dict['column']) - 1 |
35 if 'add' not in filter_dict\ | 52 if 'add' not in filter_dict\ |
77 next = __next__ | 94 next = __next__ |
78 | 95 |
79 def select_columns(self, line, cols): | 96 def select_columns(self, line, cols): |
80 fields = line.split('\t') | 97 fields = line.split('\t') |
81 return '\t'.join([fields[x] for x in cols]) | 98 return '\t'.join([fields[x] for x in cols]) |
99 | |
100 def select_slices(self, line, cols): | |
101 fields = line.split('\t') | |
102 return '\t'.join(chain.from_iterable([y if isinstance(y, list) else [y] for y in [fields[x] for x in cols]])) | |
82 | 103 |
83 def replace_add(self, line, pat, rep, col, pos): | 104 def replace_add(self, line, pat, rep, col, pos): |
84 fields = line.rstrip('\r\n').split('\t') | 105 fields = line.rstrip('\r\n').split('\t') |
85 i = pos if pos is not None else len(fields) | 106 i = pos if pos is not None else len(fields) |
86 val = '' | 107 val = '' |