#!/usr/bin/python # -*- coding: utf-8 -*- """remove_comment.py v1.0 written by fuku@rouge.gr.jp SQL からコメントを除去する 行を変更しない 使い方: ./remove_comment.py << EOF -- コメント SELECT 名前 FROM 表; /* コメント */ EOF 結果: --- ここから --- SELECT 名前 FROM 表; --- ここまで --- """ def remove_comments(sql: str) -> str: """SQL 文字列 (複数行) からコメントを削除する """ NORMAL = 0 # コメント外 LINE_COMMENT = 1 # 1行コメント中 BLOCK_COMMENT = 2 # ブロックコメント中 SINGLE_QUOTE = 3 # 文字列中(') DOUBLE_QUOTE = 4 # 文字列中(") state = NORMAL i = 0 n = len(sql) filtered = [] while i < n: c = sql[i] next_c = sql[i + 1] if i + 1 < n else '' if state == NORMAL: # 状態: コメント外 if c + next_c == '--': state = LINE_COMMENT # 状態: -> 1行コメント中 i += 1 elif c + next_c == '/*': # 状態: -> ブロックコメント中 state = BLOCK_COMMENT i += 1 elif c == "'": # 状態: -> 文字列中(') state = SINGLE_QUOTE filtered.append(c) elif c == '"': # 状態: -> 文字列中(") state = DOUBLE_QUOTE filtered.append(c) else: filtered.append(c) # 通常文字 i += 1 elif state == LINE_COMMENT: # 状態: 1行コメント中 if c == '\n': # 改行は残す filtered.append('\n') state = NORMAL # 状態: -> コメント外 i += 1 elif state == BLOCK_COMMENT: # 状態: ブロックコメント中 if c == '\n': # 改行は残す filtered.append('\n') elif c + next_c == '*/': state = NORMAL # 状態: -> コメント外 i += 1 i += 1 elif state == SINGLE_QUOTE: # 状態: 文字列中(') filtered.append(c) if c + next_c == "''": # エスケープ(') filtered.append(next_c) i += 1 elif c == "'": state = NORMAL # 状態: -> コメント外 i += 1 elif state == DOUBLE_QUOTE: # 状態: 文字列中(") filtered.append(c) if c + next_c == '""': # エスケープ(") filtered.append(next_c) i += 1 elif c == '"': state = NORMAL # 状態: -> コメント外 i += 1 return ''.join(filtered) if __name__ == '__main__': import sys sqlText = sys.stdin.read() filtered = remove_comments(sqlText) print(filtered)