回答編集履歴
3
Add comment in code
answer
CHANGED
@@ -14,6 +14,9 @@
|
|
14
14
|
self.sql = []
|
15
15
|
|
16
16
|
def scan(self, line):
|
17
|
+
"""
|
18
|
+
状態によって行う処理を切り替えて実行します
|
19
|
+
"""
|
17
20
|
line = line.rstrip()
|
18
21
|
if not self.is_elapsed:
|
19
22
|
self.search_elapsed(line)
|
@@ -27,14 +30,27 @@
|
|
27
30
|
self.sql.append(line.rstrip())
|
28
31
|
|
29
32
|
def search_elapsed(self, line):
|
33
|
+
"""
|
34
|
+
Elapsed stime の行が見つかるまでひたすら読み飛ばします
|
35
|
+
Elapsed stime の行が見つかった場合、読み飛ばしをやめるために状態を変更します
|
36
|
+
"""
|
30
37
|
if self.pattern_elapsed.match(line):
|
31
38
|
self.is_elapsed = True
|
32
39
|
|
33
40
|
def search_prev(self, line):
|
41
|
+
"""
|
42
|
+
pattern_prev の行が見つかるまでひたすら読み飛ばします
|
43
|
+
pattern_prev の行が見つかった場合、読み飛ばしをやめるために状態を変更します
|
44
|
+
"""
|
34
45
|
if self.pattern_prev.match(line):
|
35
46
|
self.is_extracting = True
|
36
47
|
|
37
48
|
def emit_sql(self):
|
49
|
+
"""
|
50
|
+
仮の list に読み貯めた複数行の SQL 文を 1 行文字列に変換して
|
51
|
+
結果の list に追加し、仮の list をクリアします
|
52
|
+
再び Elapsed stime の行が見つかるまでひたすら読み飛ばすために状態をもとに戻します
|
53
|
+
"""
|
38
54
|
self.is_elapsed = False
|
39
55
|
self.is_extracting = False
|
40
56
|
self.extracted_text_array.append(' '.join(self.sql))
|
2
Fix answer
answer
CHANGED
@@ -65,8 +65,7 @@
|
|
65
65
|
```console
|
66
66
|
$ python test.py
|
67
67
|
select owner#,name,namespace,remoteowner,linkname,p_timestamp,p_obj#, nvlp_obj#=obj#(+) order by order#
|
68
|
-
select
|
69
|
-
200 200 200 select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#, sample_ size, minimum, maximum, distcnt, lowval, hival, density, col#, spare1, spare2, a vgcln, minimum_enc, maximum_enc from hist_head$ where obj#=:1 and intcol#=:2
|
68
|
+
select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#, sample_ size, minimum, maximum, distcnt, lowval, hival, density, col#, spare1, spare2, a vgcln, minimum_enc, maximum_enc from hist_head$ where obj#=:1 and intcol#=:2
|
70
69
|
```
|
71
70
|
|
72
71
|
ポイントは、`pattern_next` にマッチしたとき `break` で処理を終わらせずに、
|
1
Fix answer
answer
CHANGED
@@ -1,30 +1,56 @@
|
|
1
|
-
|
1
|
+
要件が複雑なのでクラスを使います:
|
2
2
|
|
3
3
|
```python
|
4
4
|
import re
|
5
5
|
|
6
|
+
class Scanner:
|
7
|
+
def __init__(self, pattern_prev, pattern_next):
|
6
|
-
|
8
|
+
self.pattern_elapsed = re.compile(r"SQL\sorder\sby\sElapsed\stime")
|
9
|
+
self.pattern_prev = re.compile(pattern_prev)
|
10
|
+
self.pattern_next = re.compile(pattern_next)
|
11
|
+
self.extracted_text_array = []
|
12
|
+
self.is_elapsed = False
|
13
|
+
self.is_extracting = False
|
14
|
+
self.sql = []
|
7
15
|
|
16
|
+
def scan(self, line):
|
17
|
+
line = line.rstrip()
|
18
|
+
if not self.is_elapsed:
|
19
|
+
self.search_elapsed(line)
|
20
|
+
return
|
21
|
+
if not self.is_extracting:
|
22
|
+
self.search_prev(line)
|
23
|
+
return
|
24
|
+
if self.pattern_next.match(line):
|
25
|
+
self.emit_sql()
|
26
|
+
return
|
27
|
+
self.sql.append(line.rstrip())
|
28
|
+
|
29
|
+
def search_elapsed(self, line):
|
30
|
+
if self.pattern_elapsed.match(line):
|
31
|
+
self.is_elapsed = True
|
32
|
+
|
33
|
+
def search_prev(self, line):
|
34
|
+
if self.pattern_prev.match(line):
|
35
|
+
self.is_extracting = True
|
36
|
+
|
37
|
+
def emit_sql(self):
|
38
|
+
self.is_elapsed = False
|
39
|
+
self.is_extracting = False
|
40
|
+
self.extracted_text_array.append(' '.join(self.sql))
|
41
|
+
self.sql = []
|
42
|
+
|
43
|
+
|
8
44
|
def extract_text_in_file(filepath, pattern_prev, pattern_next):
|
9
|
-
|
45
|
+
scanner = Scanner(pattern_prev, pattern_next)
|
10
46
|
with open(filepath, "r", encoding="utf-8") as f:
|
11
|
-
is_extracting = False
|
12
|
-
sql = []
|
13
47
|
for line in f:
|
14
|
-
line = line.rstrip()
|
15
|
-
|
48
|
+
scanner.scan(line)
|
16
|
-
if re.match(pattern_prev, line):
|
17
|
-
is_extracting = True
|
18
|
-
continue
|
19
|
-
if re.match(pattern_next, line):
|
20
|
-
extracted_text_array.append(' '.join(sql))
|
21
|
-
sql = []
|
22
|
-
is_extracting = False
|
23
|
-
continue
|
24
|
-
sql.append(line.rstrip())
|
25
49
|
|
26
|
-
return extracted_text_array
|
50
|
+
return scanner.extracted_text_array
|
27
51
|
|
52
|
+
filepath = 'C:\Users\Desktop\新しいフォルダー\sample.txt'
|
53
|
+
|
28
54
|
pattern_prev = r'module:'
|
29
55
|
pattern_next = r'^$'
|
30
56
|
extracted_text_array = extract_text_in_file(filepath, pattern_prev, pattern_next)
|