Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Работа с текстовым файлом (http://forum.oszone.net/showthread.php?t=282346)

iccup.platoon@vk 17-05-2014 11:01 2352396

Работа с текстовым файлом
 
Приветствую. По "работе" нужно копаться с файлами - перетаскивать строки в файле "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 2353825

Пробуйте:
читать дальше »
Код:

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 файл уже существовал ранее — его содержимое будет утеряно).


Время: 22:45.

Время: 22:45.
© OSzone.net 2001-