Компьютерный форум 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=339985)

Artas28 04-04-2019 14:27 2866564

Разбите текстового файла на отдельные файлы по определенному условию
 
Здравствуйте. Нужна помощь. Есть список программ, скаченных с ЧПУ станка одним файлом. Необходимо этот файл разделить на отдельные файлы, например по началу программы ("O").
Т.е. если в программе присутствует O, то он должен от неё и до другого O, вырезать эту часть текста и создать новый документ с этим текстом.


Пример:

Скрытый текст

O0009(Bolt M14x1_6GRANNIK)
(ROMB)
T1M3S2700G99
G0X18.Z5.
G01Z0.2F0.1
X-1.
Z2.
G0X12.
G1Z-1.7F0.14
X12.3
Z1.
X10.
Z-1.3
X10.3
Z1.
X8.
........
T8
G0X0
Z0
M05
G4X0.5
M99
O0021
M70
M00
M71
M30

O0004(KR M18*1.5 L25.5)
(ROMB)
T1M3S3500G99
G0Z3.0M8
X3.
G1Z0.F0.1
X18.Z-3.6F0.25
Z-20.3
G0X19.Z-3.73
G1X18.
X-0.2Z0.F0.15
G0Z25.
.......

mwz 04-04-2019 15:30 2866575

Цитата:

Цитата Artas28
G4X0.5
M99
O0021
M70 »

— по этому О тоже должно резать?

Artas28 04-04-2019 15:40 2866576

Цитата:

Цитата mwz
— по этому О тоже должно резать? »

Да.

megaloman 04-04-2019 18:23 2866595

Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In\infile.txt"
        Set "BoxOut=Z:\Box_Out"
        Set "Delim=O"

        Set "OutFile=Err.txt"
        FOR /F "usebackq delims=" %%i IN ("%BoxIn%") DO Call :Out "%BoxOut%" "%%i"
pause
Exit /B 0

:Out
        Set "Str=%~2"
        If "%Str:~0,1%"=="%Delim%" FOR /F "delims=(" %%j IN ("%Str%") DO (
                Set "OutFile=%%j"
                2>nul Del "%~1\%%j"
        )
        >>"%~1\%OutFile%" Echo %~2
Exit /B 0


YuS_2 04-04-2019 21:07 2866627

Цитата:

Цитата Artas28
Т.е. если в программе присутствует O, то он должен от неё и до другого O, вырезать эту часть текста и создать новый документ с этим текстом. »

powershell
Код:

gc test.txt|%{$i=0;$name="$i"+'.txt'}{if($_ -match '^O'){$i++;$name = "$i"+'.txt'};$_|ac $name}

Iska 05-04-2019 00:48 2866658

PowerShell, токмо через split:
Код:

# gc test.txt|%{$i=0;$name="$i"+'.txt'}{if($_ -match '^O'){$i++;$name = "$i"+'.txt'};$_|ac $name}
(Get-Content -Path 'C:\Мои проекты\0257\Source.txt' -Raw) -split "`r`nO" |`
    ForEach-Object -Begin {
        $i = 0
    } -Process {
        $i++
        Set-Content -Path "C:\Мои проекты\0257\Dest_$i.txt" -Value $('O' + $_)
    }


Artas28 05-04-2019 08:43 2866672

Спасибо!

Artas28 05-04-2019 09:06 2866674

А реально сделать, что бы он файл называл не 1 или dest_1 а по названию программы в файле, если он вырезал O0003 то и файл будет называться 0003 или 3 или О0003 ?
Хотя и так отлично работает)

Artas28 05-04-2019 12:57 2866706

Цитата:

Цитата megaloman
вроде бы у меня сделано именно так! »

А через какую программу запускать этот код?
в PowerShell работать будет?

megaloman 05-04-2019 13:39 2866711

Artas28,
Цитата:

А реально сделать, что бы он файл называл не 1 или dest_1 а по названию программы в файле, если он вырезал O0003 то и файл будет называться 0003 или 3 или О0003 ?
вроде бы у меня сделано именно так!
Цитата:

Цитата Artas28
А через какую программу запускать этот код? »

Сохранить код в файл с расширением .bat и запускать как любой другой исполнимый файл. Естественно, вместо моих путей прописать Ваши реальные

Artas28 05-04-2019 14:15 2866719

Цитата:

Цитата megaloman
Естественно, вместо моих путей прописать Ваши реальные »

@Echo Off
cls
Set "BoxIn=C:\Newfolder\FileName.txt"
Set "BoxOut=C:\Newfolder\"
Set "Delim=O"

Set "OutFile=Err.txt"
FOR /F "usebackq delims=" %%i IN ("%BoxIn%") DO Call :Out "%BoxOut%" "%%i"
pause
Exit /B 0

:Out
Set "Str=%~2"
If "%Str:~0,1%"=="%Delim%" FOR /F "delims=(" %%j IN ("%Str%") DO (
Set "OutFile=%%j"
2>nul Del "%~1\%%j"
)
>>"%~1\%OutFile%" Echo %~2
Exit /B 0

Так?

Iska 05-04-2019 18:45 2866759

Цитата:

Цитата Artas28
что бы он файл называл не 1 или dest_1 а по названию программы в файле, если он вырезал O0003 то и файл будет называться 0003 или 3 или О0003 ? »

Код:

$sDelim = 'O'
(Get-Content -Path 'C:\Мои проекты\0257\Source.txt' -Raw) -split "`r`n$sDelim" |`
    ForEach-Object -Begin {
        $sDelim = ''
    } -Process {
        $sDestName = $sDelim + ($_ -split "`r`n")[0] -replace '\<|\>|:|"|/|\\|\||\?|\*', '_'
        Set-Content -Path "C:\Мои проекты\0257\$sDestName.txt" -Value $($sDelim + $_)
        if($sDelim -eq '') { $sDelim = 'O' }
    }


megaloman 05-04-2019 19:10 2866762

Цитата:

Цитата Artas28
Set "BoxOut=C:\Newfolder\" »

Без слэжа
Код:

Set "BoxOut=C:\Newfolder"


Время: 21:20.

Время: 21:20.
© OSzone.net 2001-