PDA

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


Artas28
04-04-2019, 14:27
Здравствуйте. Нужна помощь. Есть список программ, скаченных с ЧПУ станка одним файлом. Необходимо этот файл разделить на отдельные файлы, например по началу программы ("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
G4X0.5
M99
O0021
M70 »— по этому О тоже должно резать?

Artas28
04-04-2019, 15:40
— по этому О тоже должно резать? »
Да.

megaloman
04-04-2019, 18:23
@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
Т.е. если в программе присутствует 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
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
Спасибо!

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

Artas28
05-04-2019, 12:57
вроде бы у меня сделано именно так! »
А через какую программу запускать этот код?
в PowerShell работать будет?

megaloman
05-04-2019, 13:39
Artas28,А реально сделать, что бы он файл называл не 1 или dest_1 а по названию программы в файле, если он вырезал O0003 то и файл будет называться 0003 или 3 или О0003 ? вроде бы у меня сделано именно так!А через какую программу запускать этот код? »Сохранить код в файл с расширением .bat и запускать как любой другой исполнимый файл. Естественно, вместо моих путей прописать Ваши реальные

Artas28
05-04-2019, 14:15
Естественно, вместо моих путей прописать Ваши реальные »

@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
что бы он файл называл не 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
Set "BoxOut=C:\Newfolder\" »Без слэжа Set "BoxOut=C:\Newfolder"




© OSzone.net 2001-2012