-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOptimiseSQLScriptFromDBeaver.py
More file actions
140 lines (104 loc) · 6.52 KB
/
Copy pathOptimiseSQLScriptFromDBeaver.py
File metadata and controls
140 lines (104 loc) · 6.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Imports System.IO
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim FileReader As String
Dim PathToScript As String
Dim OrigScriptName As String
Dim OptimScriptName As String
Dim PathToOptimScript As String
Dim FileList As New List(Of String)
Dim FileIndex As Integer
'Получение папки со скриптами от пользователя
Dim ValidFile As Boolean = False
Console.WriteLine("Введите путь к папке с файлами скрипта, для их обработки у файла должен быть префикс SCRIPT_INSERT_INTO_...")
PathToScript = Console.ReadLine()
For Each FoundFile As String In My.Computer.FileSystem.GetFiles(PathToScript)
If FoundFile.Contains("SCRIPT_INSERT_INTO_") And FoundFile.Contains(".sql") Then
FileList.Add(FoundFile)
End If
Next
'Обработка каждого файла
For FileIndex = 0 To FileList.Count - 1
OrigScriptName = Path.GetFileNameWithoutExtension(FileList.Item(FileIndex))
Console.WriteLine("Обработка файла: " & OrigScriptName)
'Чтение файла скрипта
FileReader = My.Computer.FileSystem.ReadAllText(FileList.Item(FileIndex))
'++Изменение содержимого скрипта++
'Удаление переносов строк
FileReader = Replace(FileReader, vbCrLf, "")
'Запись в коллекцию всех похожих строк типа INSERT INTO
Dim RegexList As New List(Of String)
Dim Pattern As String = "INSERT INTO .+? (.+?) "
Dim RGXWrite As New Regex(Pattern)
For Each PatternConj As Match In RGXWrite.Matches(FileReader)
RegexList.Add(PatternConj.Value)
Next
'Вставка правильных переносов строк в SQL файл
Dim FileReaderArr() As String
FileReaderArr = Split(FileReader, ";")
FileReader = Join(FileReaderArr, ";" & vbCrLf)
'Удаление повторяющихся строк в коллекции и добавление редактированного List обратно в Temp
Dim RegexListRedacted As New List(Of String)
Dim LineCont As String
Dim i As Integer
For Each LineCont In RegexList
If Not RegexListRedacted.Contains(LineCont) Then
RegexListRedacted.Add(LineCont)
End If
Next
'Редактирование данных построчно (убрать лишние строки INSERT INTO)
Dim OriginalTextArr() As String
Dim StringTEMP() As String
Dim INSINTPlace As New List(Of Integer)
Dim PatternFromRegex As String
Dim CmplBoolean As Boolean = False
Dim j As Integer = 0
OriginalTextArr = Split(FileReader, vbCrLf)
StringTEMP = Split(FileReader, vbCrLf)
For i = 0 To OriginalTextArr.Count - 1
If OriginalTextArr(i) <> "" Then 'Для игнорирования пустых строк
For j = 0 To RegexListRedacted.Count - 1
PatternFromRegex = RegexListRedacted.Item(j)
If OriginalTextArr(i).Contains(PatternFromRegex) = True Then 'Проверка, содержит ли данная строка запись в макете
If i = 0 Then 'Пропуск первой строки
CmplBoolean = False
Else
CmplBoolean = IIf(StringTEMP(i - 1).Contains(PatternFromRegex) = True, True, False) 'Сравнение, содержит ли эта строка такие же данные как и предыдущая по TEMP массиву
End If
Exit For
End If
Next j
If CmplBoolean = True Then
OriginalTextArr(i) = Replace(OriginalTextArr(i), RegexListRedacted.Item(j), "") 'Удаление ненужной информации в строках
Else
INSINTPlace.Add(i) 'Добавление номера строки в котором находится запись типа INSERT INTO () VALUES ()
End If
End If
Next i
'Редактирование данных построчно (Редактирование текста функции VALUES, она остается в строке)
For i = 0 To INSINTPlace.Count - 1
OriginalTextArr(INSINTPlace(i)) = Replace(OriginalTextArr(INSINTPlace(i)), " VALUES", vbCrLf & "VALUES")
OriginalTextArr(INSINTPlace(i)) = Replace(OriginalTextArr(INSINTPlace(i)), ");", "),")
Next i
'Редактирование данных построчно (Редактирование текста функции VALUES, она остается в строке)
For i = 0 To OriginalTextArr.Count - 1
If i <> OriginalTextArr.Count - 1 Then
If OriginalTextArr(i).StartsWith("VALUES (") = True And OriginalTextArr(i + 1).Contains("INSERT INTO") = False Then
OriginalTextArr(i) = Replace(OriginalTextArr(i), ");", "),")
End If
End If
Next i
FileReader = Join(OriginalTextArr, vbCrLf)
'Создание файла оптимизированного скрипта и запись
OptimScriptName = OrigScriptName & "_Optimized.sql"
Console.WriteLine("Создание файла " & OptimScriptName)
PathToOptimScript = PathToScript & "\" & OptimScriptName
My.Computer.FileSystem.WriteAllText(PathToOptimScript, FileReader, False)
Console.WriteLine("Файл " & OrigScriptName & " обработан и оптимизирован.")
'Обнуление FileReader
FileReader = ""
Next
Console.ReadLine()
End Sub
End Module