Войти

Показать полную графическую версию : Парсинг txt фала через bat


bifidok1
29-01-2020, 18:18
Дан файл
D24034CD;28.01.2020 16:59:00;Выход;
D2414664;28.01.2020 17:04:24;Выход;
D2411Ф1B;28.01.2020 17:16:19;Выход;

мне нужно заменить некоторые параметры в нем и заархивировать в 7-zip , у меня получился код
Chcp 1251

@echo off
setlocal enabledelayedexpansion
Set infile=21.txt
Set find="
Set replace=
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP.TXT
)
move TMP.TXT
@echo off
setlocal enabledelayedexpansion
Set infile=TMP.TXT
Set find=
Set replace=;
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP1.TXT
)
move TMP.TXT
@echo off
setlocal enabledelayedexpansion
Set infile=tmp1.txt
Set find=выход
Set replace=2
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP2.TXT
)
move TMP.TXT

move TMP.TXT
@echo off
setlocal enabledelayedexpansion
Set infile=tmp2.txt
Set find=вход
Set replace=1
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP3.txt
)
move TMP.TXT

del tmp.txt
del tmp1.txt
del tmp2.txt
7z.exe a -tzip -ssw -mx1 -ppassword -r0 "путь к файлу\TMP3.txt" %DATE:~0,2%.%DATE:~3,2%.%DATE:~-4%_4800_01.7z

Помогите его оптимизировать, а то получается каждый раз создаю 4 файла(

megaloman
29-01-2020, 18:46
мне нужно заменить некоторые параметры в нем »Напишите, что Вы делаете со строками. С каждым из параметров. Разбираться с путанным кодом занудливо. ИМХО, это произведение оптимизировать - только портить :)

iglezz
29-01-2020, 23:35
Несколько замен в одном цикле (и в одном временном файле) можно сделать так:@echo off
chcp 1251 >nul

set infile=test1.txt

set outfile=test1a.txt
del /f /q "%outfile%" >nul 2>&1

set "find1=;"
set "replace1= "

set "find2=:"
set "replace2=_"

set "find3=."
set "replace4=_"

setlocal enabledelayedexpansion

for /F "tokens=* delims=" %%L in (%infile%) do (
set STR=%%L
set NEWSTR=!STR:%find1%=%replace1%!
set NEWSTR=!NEWSTR:%find2%=%replace2%!
set NEWSTR=!NEWSTR:%find3%=%replace3%!
echo !NEWSTR!>>"%outfile%"
)

7z.exe a -tzip test1.zip "%outfile%"

Serguei Kouzmine
30-01-2020, 06:54
bifidok1, не думали использовать для замены опвершел ? он умеет хорошо

bifidok1
30-01-2020, 08:14
К сожалению с повершелом совсем не дружу.
Цикл отрабатывает хорошо.

DJ Mogarych
30-01-2020, 08:58
bifidok1, что надо сделать-то, можете словами описать?

megaloman
30-01-2020, 09:21
bifidok1, @Echo Off
cls
>nul chcp 1251
Set "BoxIn=Z:\Путь к файлу"
Set "FileIn=Дан файл.txt"

Set "@R01="="
Set "@R02= =;"
Set "@R03=Выход=2"
Set "@R04=Вход=1"

Md "%BoxIn%\%~nx0.tmp"

>"%BoxIn%\%~nx0.tmp\%FileIn%" (FOR /F "usebackq delims=" %%s IN (`2^>nul More "%BoxIn%\%FileIn%"`) Do (
Set "Str=%%s"
FOR /F "usebackq tokens=1* delims==" %%q IN (`Set "@R"`) Do Call Set "Str=%%Str:%%r%%"
Call Echo %%Str%%
))

"C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx1 -ppassword -r0 "%DATE:~0,2%.%DATE:~3,2%.%DATE:~-4%_4800_01.7z" "%BoxIn%\%~nx0.tmp\%FileIn%"
Rd /S /Q "%BoxIn%\%~nx0.tmp"
pause
Exit /B 0

bifidok1
30-01-2020, 09:23
Нужно привести файл в нужный формат
Дано:
"D310E3CD";"28.01.2020 16:59:00";"Выход";
"D3114664";"28.01.2020 17:04:24";"Выход";
"D3111B1B";"28.01.2020 17:16:19";"Выход";
"";"28.01.2020 17:16:23";"Выход";
"D310EC09";"28.01.2020 17:30:19";"Выход";
"D310EC00";"28.01.2020 17:30:21";"Выход";
"D3108B4A";"28.01.2020 17:31:44";"Выход";
"D3108B4A";"28.01.2020 17:31:44";"Выход";
"D3108B4A";"28.01.2020 17:31:45";"Вход";
"";"28.01.2020 17:32:16";"Выход";

конечный файл
D310E3CD;28.01.2020;16:59:00;2;1
D3114664;28.01.2020;17:04:24;2;1
D3111B1B;28.01.2020;17:16:19;2;1
;28.01.2020;17:16:23;2;1
D310EC09;28.01.2020;17:30:19;2;1
D310EC00;28.01.2020;17:30:21;2;1
D3108B4A;28.01.2020;17:31:44;1;1
;28.01.2020;17:32:16;2;1


Вход заменяем на 1
Выход заменяем на 2
Добавляем в конец 1

Батник в принципе работает, проблема только как удалить строки у которых нет первого идентификатора, типо такого
;28.01.2020;17:16:23;2;1

DJ Mogarych
30-01-2020, 09:37
Проще всего сделать "батник" через вызов Powershell:

powershell -command "(gc D:\temp\log.txt -Encoding utf8) -replace 'Выход','2' -replace 'Вход','1' -replace '$','1' -replace '\"' -replace ' ',';' ^|Set-Content D:\temp\log.txt"

А что, надо убирать кавычки и разделять метку времени на две части?

megaloman
30-01-2020, 09:56
@Echo Off
cls
>nul chcp 1251
Set "BoxIn=Z:\Путь к файлу"
Set "FileIn=Нужно привести файл в нужный формат.txt"

Md "%BoxIn%\%~nx0.tmp"

>"%BoxIn%\%~nx0.tmp\%FileIn%" (FOR /F "usebackq tokens=1,2,3 delims=;" %%i IN (`2^>nul More "%BoxIn%\%FileIn%"`) Do Call :Out "%%~i" "%%~j" "%%~k")
"C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx1 -ppassword -r0 "%DATE:~0,2%.%DATE:~3,2%.%DATE:~-4%_4800_01.7z" "%BoxIn%\%~nx0.tmp\%FileIn%"
Rd /S /Q "%BoxIn%\%~nx0.tmp"
pause
Exit /B 0

:Out
If %1=="" Exit /B 1
Set "Str=%~2"
If /I %3=="Выход" Set "Str=%~1;%Str: =;%;2;1"
If /I %3=="Вход" Set "Str=%~1;%Str: =;%;1;1"
Echo %Str%
Exit /B

bifidok1
30-01-2020, 09:56
Да, разделитель должен быть только ;

DJ Mogarych
30-01-2020, 10:30
Поправил выше.




© OSzone.net 2001-2012