Войти

Показать полную графическую версию : [решено] Выделить всё что между A и B


ferum
17-11-2021, 18:15
Здравствуйте, помогите пожалуйста, сделать два скрипта.

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

"mixedTags":[],"sedIds":[],"relatedCount":{"73501482":923},"wasLoaded":true,"NonTags":false,"hasFinished":false,"recommended":[]},"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
на повершелле довольно элементарно - рассматриваете этот вариант ?

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

DJ Mogarych
17-11-2021, 20:09
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
@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
Спасибо, но к сожалению работает только если в файле 1023 символа и нет перевода строки.

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

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

http://forum.oszone.net/attachment.php?attachmentid=165652&stc=1&d=1637211390

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

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

megaloman
18-11-2021, 09:37
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
Powershell:

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

ferum
18-11-2021, 10:03
Спасибо, а на vbs или js можно сделать что-нибудь универсальное? )

DJ Mogarych
18-11-2021, 10:08
Powershell из принципа не используете?

ferum
18-11-2021, 10:39
Повершелом я никогда не пользовался (незнаю).

DJ Mogarych
18-11-2021, 10:42
Ну так самое время начать.

megaloman
18-11-2021, 11:48
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
Cпасибо большое!
То что нужно.




© OSzone.net 2001-2012