質問するログイン新規登録

回答編集履歴

3

Add comment in code

2020/07/19 06:00

投稿

y_shinoda
y_shinoda

スコア3272

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

2020/07/19 05:59

投稿

y_shinoda
y_shinoda

スコア3272

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 p_obj#, nvlp_obj#=obj#(+) order by order#
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

2020/07/19 03:13

投稿

y_shinoda
y_shinoda

スコア3272

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
- filepath = 'C:\Users\Desktop\新しいフォルダー\sample.txt'
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
- extracted_text_array = []
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
- if not is_extracting:
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)