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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Выделить всё что между A и B (http://forum.oszone.net/showthread.php?t=350071)

ferum 17-11-2021 18:15 2972279

Выделить всё что между A и B
 
Здравствуйте, помогите пожалуйста, сделать два скрипта.

Есть файл 1.txt примерно с таким содержанием:

"mixedTags":[],"sedIds":[],"relatedCount":{"73501482":923},"wasLoaded":true,"NonTags":false,"hasFinished":false,"recommende d":[]},"NomesTop":{"contestType":null,"isPending":true,"loadError":null,"points":[],"prizes":[],"scores":[],"tops":[],"winnerIds":[]},"relations":{"49020024":045},"wasNoLoaded"

Файл большой, это примерный отрывок
Надо выделить всё что находится между "relatedCount" и "wasLoaded"
Содержимое может быть разным

в первом скрипте:
содержимое записать в файл 2.txt

во втором:
содержимое удалить и результат тоже записать в файл 2.txt

Serguei Kouzmine 17-11-2021 19:24 2972291

на повершелле довольно элементарно - рассматриваете этот вариант ?

ferum 17-11-2021 19:53 2972294

Это и есть кусок, файл полностью на английском с разными знаками и цифрами, но уникальные в нём "relatedCount" и "wasLoaded" здесь надо выделить :{"73501482":923},

DJ Mogarych 17-11-2021 20:09 2972297

Powershell
Код:

$file = gc "C:\temp\text.txt"
$file -replace '(.+relatedCount\")(.+)(\"wasLoaded.*)','$2' > "C:\temp\2.txt"
$file -replace '(.+relatedCount\")(.+)(\"wasLoaded.*)','$1$3' >> "C:\temp\2.txt"

Наверное, можно и поизящнее, но я не знаю, как сохранить сегменты -replace.


Эврика!
Код:

(gc "C:\temp\text.txt") -match '(.+relatedCount\")(.+)(\"wasLoaded.*)'
$matches[2] > "C:\temp\2.txt"
$matches[1] + $matches[3] >> "C:\temp\2.txt"


megaloman 17-11-2021 20:15 2972299

Код:

@Echo Off
cls
        Set "FileIn=Z:\Box_In\1 текстовый файл.txt"
        Set "FileOut1=Z:\Box_In\2 текстовый файл.txt"
        Set "FileOut2=Z:\Box_In\3 текстовый файл.txt"

        Set "Begin="relatedCount":"
        Set "End="wasLoaded":"

        Set /P InTxt=<"%FileIn%"

        Call Set "OutTxt=%%InTxt:%Begin%=*%%"
        Call Set "OutTxt=%%OutTxt:%End%=*%%"

        For /F "tokens=2 delims=*" %%i IN ("%OutTxt%") Do (
                >"%FileOut1%" (Echo %%i)
                >"%FileOut2%" (Call Echo %%InTxt:%%i=%%)
        )
Pause
Exit /B


ferum 18-11-2021 07:59 2972336

Вложений: 1
Спасибо, но к сожалению работает только если в файле 1023 символа и нет перевода строки.

Мне просто часто приходится выполнять такую задачу: выделять часть из какого нибудь текста (файла).

Давайте так, вот файл:

http://forum.oszone.net/attachment.p...1&d=1637211390

Надо выделить всё что между Example: и if largest

Должно получиться -mf=BCJ2:d9M,

megaloman 18-11-2021 09:37 2972344

ferum, Для конкретного примера, текст разбит построчно
Код:

@Echo Off
cls
        Set "FileIn=D:\Мой контент\Загрузки\History.txt"
        Set "FileOut=Z:\Box_In\2 текстовый файл.txt"

        Set "Begin=  Example: "
        Set "End= if largest"

        >"%FileOut%" (For /F "usebackq delims=" %%i In (`2^>nul FINDSTR /I /X /R /C:"^.*%Begin:.=\.%.*%End:.=\.%.*" "%FileIn%"`) Do (
                Set "Out=%%i"
                Call Set "Out=%%Out:*%Begin%=%%"
                Call Set "Out=%%Out:%End%=^%%"
                For /F "usebackq tokens=1 delims=^" %%s In (`Call Echo %%Out%%`) Do Echo %%s
        ))
Pause
Exit /B

Если строка с указанным контекстом очень длинная - не получится в CMD.

DJ Mogarych 18-11-2021 09:49 2972345

Powershell:
Код:

(((gc "D:\temp\History.txt" -raw) -split 'Example:') -split 'if largest')[1]

ferum 18-11-2021 10:03 2972352

Спасибо, а на vbs или js можно сделать что-нибудь универсальное? )

DJ Mogarych 18-11-2021 10:08 2972353

Powershell из принципа не используете?

ferum 18-11-2021 10:39 2972363

Повершелом я никогда не пользовался (незнаю).

DJ Mogarych 18-11-2021 10:42 2972366

Ну так самое время начать.

megaloman 18-11-2021 11:48 2972376

vbs
Код:

FileIn = "D:\Мой контент\Загрузки\History.txt"
Begin = "  Example: "
Endin = " if largest"

'FileIn = "Z:\Box_In\1 текстовый файл.txt"
'Begin = "relatedCount"":"
'Endin = """wasLoaded"":"

FileOut = "Z:\Box_In\2 текстовый файл.txt"

With CreateObject("Scripting.FileSystemObject")
    If Not .FileExists(FileIn) Then
        MsgBox "File: " + vbCrLf + FileIn + vbCrLf + "not exists", 48, "File not exists"
    Else
        With .OpenTextFile(FileIn, 1)
            On Error Resume Next
            AllTxt = .ReadAll
            If Err.Number <> 0 Then
                MsgBox "File: " + vbCrLf + FName + vbCrLf + Err.Description, 48, "Error Reading File"
                RTrimFile = 2
                .Close
            End If
            On Error GoTo 0
            .Close
        End With
        AllTxt = Replace(" " + AllTxt, Begin, Chr(1))
        AllTxt = Replace(" " + AllTxt, Endin, Chr(1))
        AllTxt = Split(AllTxt, Chr(1))
        With .OpenTextFile(FileOut, 2, True)
            .Write AllTxt(1)
            .Close
        End With
        MsgBox AllTxt(1)
    End If
End With


ferum 18-11-2021 13:08 2972389

Cпасибо большое!
То что нужно.


Время: 06:25.

Время: 06:25.
© OSzone.net 2001-