Войти

Показать полную графическую версию : Работа с текстовым файлом


iccup.platoon@vk
17-05-2014, 11:01
Приветствую. По "работе" нужно копаться с файлами - перетаскивать строки в файле "A.txt" по примеру постановки текста в файле "B.txt". Соль в том, что во-первых в файлах, с которыми мне нужно работать, очень много пустых строк и комментариев, начинающихся на символ "#", во-вторых строки просто по-разному стоят, и с этим очень нудно работать, по этому я очень надеюсь на вашу помощь.
Вот текст файла-примера:


map_path = Maps\Download\Angel Arena Allstars v1.69f.w3x
map_localpath = Angel Arena Allstars v1.69f.w3x
map_type = custom
map_size = 108 221 49 0
map_info = 54 3 122 61
map_crc = 114 59 138 108
map_sha1 = 136 225 120 234 157 17 0 249 209 164 91 38 0 24 30 86 63 226 31 220
map_width = 180 0
map_height = 151 0
map_numplayers = 12
map_numteams = 2
map_slot1 = 0 255 0 0 0 0 1 1 100
map_slot2 = 0 255 0 0 0 1 1 1 100
map_slot3 = 0 255 0 0 0 2 1 1 100
map_slot4 = 0 255 0 0 0 3 1 1 100
map_slot5 = 0 255 0 0 0 4 1 1 100
map_slot6 = 0 255 0 0 0 5 1 1 100
map_slot7 = 0 255 0 0 1 6 1 1 100
map_slot8 = 0 255 0 0 1 7 1 1 100
map_slot9 = 0 255 0 0 1 8 1 1 100
map_slot10 = 0 255 0 0 1 9 1 1 100
map_slot11 = 0 255 0 0 1 10 1 1 100
map_slot12 = 0 255 0 0 1 11 1 1 100
map_speed = 3
map_visibility = 4
map_observers = 1
map_flags = 3
map_gametype = 1
map_icctype = 2


А так выглядит файл, с которым нужно работать:


map_path = Maps\Download\SurvivalChaos2.86p.w3x
map_size = 133 137 70 0
map_info = 82 54 65 169
map_crc = 222 220 100 59
map_sha1 = 10 230 170 119 178 69 186 113 143 181 41 81 81 10 134 6 17 185 151 233
map_speed = 3
map_visibility = 4
map_observers = 1
map_flags = 3
map_gametype = 1
map_width = 92 0
map_height = 92 0
map_numplayers = 8
map_numteams = 4
map_slot1 = 0 255 2 1 1 0 1 1 100
map_slot2 = 0 255 2 1 2 1 1 1 100
map_slot3 = 0 255 2 1 0 4 1 1 100
map_slot4 = 0 255 0 0 0 5 32 1 100
map_slot5 = 0 255 2 1 3 6 1 1 100
map_slot6 = 0 255 0 0 1 7 32 1 100
map_slot7 = 0 255 0 0 2 9 32 1 100
map_slot8 = 0 255 0 0 3 10 32 1 100
map_type =
map_matchmakingcategory =
map_statsw3mmdcategory =
map_localpath = SurvivalChaos2.86p.w3x


Не обращайте внимания на то, что стоит после "=" - главное, чтобы все строки шли как в файле примере, по той же очереди.
Примечание: параметр map_slot в некоторых
файлах встречается не один раз.
Мне нужно всего 3 вещи:
1) Чтобы строки во втором файле были расположены как в первом
2) Чтобы в получившемся файле не было пустых строк
3) Чтобы в получившемся файле не было строк, начинающихся на символ "#"
Фух, всё описал. Очень надеюсь на вашу помощь, заранее спасибо.

Iska
21-05-2014, 01:18
Пробуйте:
Option Explicit

Dim objFSO

Dim strFileMaster
Dim strFileWorking

Dim arrContent
Dim i
Dim objDictionaryMaster
Dim objDictionaryWorking

Dim strKey


If WScript.Arguments.Count = 2 Then
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strFileMaster = WScript.Arguments.Item(0)

If Not objFSO.FileExists(strFileMaster) Then
WScript.Echo "Master file [" & strFileMaster & "] not found."
WScript.Quit 2
End If

strFileWorking = WScript.Arguments.Item(1)

If Not objFSO.FileExists(strFileWorking) Then
WScript.Echo "Working file [" & strFileWorking & "] not found."
WScript.Quit 3
End If

Set objDictionaryMaster = WScript.CreateObject("Scripting.Dictionary")
Set objDictionaryWorking = WScript.CreateObject("Scripting.Dictionary")

With objFSO.OpenTextFile(strFileMaster)
arrContent = Split(.ReadAll(), vbCrLf)
.Close
End With

For i = LBound(arrContent) To UBound(arrContent) - 1
arrContent(i) = Trim(arrContent(i))

If Len(arrContent(i)) <> 0 Then
If Left(arrContent(i), 1) <> "#" Then
If InStr(arrContent(i), "=") > 0 Then
objDictionaryMaster.Add Trim(Split(arrContent(i), "=", 2)(0)), Trim(Split(arrContent(i), "=", 2)(1))
End If
End If
End If
Next

With objFSO.OpenTextFile(strFileWorking)
arrContent = Split(.ReadAll(), vbCrLf)
.Close
End With

For i = LBound(arrContent) To UBound(arrContent) - 1
arrContent(i) = Trim(arrContent(i))

If Len(arrContent(i)) <> 0 Then
If Left(arrContent(i), 1) <> "#" Then
If InStr(arrContent(i), "=") > 0 Then
objDictionaryWorking.Add Trim(Split(arrContent(i), "=", 2)(0)), Trim(Split(arrContent(i), "=", 2)(1))
End If
End If
End If
Next

objFSO.CopyFile strFileWorking, objFSO.GetBaseName(strFileWorking) & ".bak", True

With objFSO.CreateTextFile(strFileWorking, True)
For Each strKey In objDictionaryMaster.Keys
If objDictionaryWorking.Exists(strKey) Then
.WriteLine strKey & " = " & objDictionaryWorking.Item(strKey)

objDictionaryMaster.Remove strKey
objDictionaryWorking.Remove strKey
Else
.WriteLine strKey & " = "
End If
Next

.WriteLine
.WriteLine "# Lines below not found by patterns of Master file [" & strFileMaster & "]:"

For Each strKey In objDictionaryWorking.Keys
.WriteLine strKey & " = " & objDictionaryWorking.Item(strKey)
Next

.Close
End With
Else
WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Master file> <Working file>"
WScript.Quit 1
End If

WScript.Quit 0

Скрипту требуется указать два аргумента: образец, мастер-файл и рабочий, целевой файл. Из мастер-файла берутся левые части строк до символа «=» и их порядок. Из целевого файла убираются пустые строки и строки, начинающиеся на «#». Из остальных строк в порядке, заданном порядком левых частей строк мастер-файла, строится новое содержимое целевого файла.

Если в мастер-файле существуют левые части строк, отсутствующие в целевом файле, то такие строки добавляются в целевой файл с пустыми значениями — пустыми правыми частями после знака равенства.

В конце нового содержимого целевого файла указываются строки оригинального целевого файла, которым не было найдено соответствия с левыми частями строк мастер-файла.

Оригинальное предыдущее содержимое целевого файла остаётся доступным в одноимённом файле с расширением «.bak» (при этом, если таковой .bak файл уже существовал ранее — его содержимое будет утеряно).




© OSzone.net 2001-2012